Хранение информации в удаленной базе данных стало обычной практикой при разработке программных продуктов. Blender – не исключение. При написании скриптов и аддонов, разработчик может столкнуться с необходимостью обращения к базе данных, чтобы получить из нее или записать в нее необходимые данные. MySQL на сегодня является одной из самых распространенных и общедоступных баз данных и хорошо подходит для работы с Blender.
Взаимодействие Blender с базой данных MySQL через Python API не преставляет особых сложностей, однако сначала необходимо выполнить некоторую подготовку:
В базовой комплектации Blender Python отсутствует модуль связи с базой данных – MySQL Connector. Нужно его установить:
- С официального сайта MySQL необходимо скачать MySQL Connector для Python:
- Для этого нужно перейти по ссылке: https://dev.mysql.com/downloads/connector/python/
- В пункте Select Operating System
- выбрать Platform Independent
- Скачать архив с модулем MySQL Connector: Platform Independent (Architecture Independent), ZIP Archive Python
- Распаковать архив во временную директорию, например на диск D:/
- Из распакованного архива из D:/mysql-connector-python-2.1.5/lib/ скопировать директорию mysql в директорию lib Blender. Если Blender располагается в C:/Program Files, директорию mysql нужно скопировать в C:/Program Files/blender-2.78c-windows64/2.78/python/lib/.
На этом подготовка заканичивается, модуль для связи MySQL с Blender установлен, можно переходить к работе непосредственно с базой данных.
Подключив для работы с API Blender внешнюю IDE PyCharm или же просто воспользовавшись встроенным текстовым редактором, напишем код для обращения к базе данных MySQL:
- Импортируем необходимые модули: bpy – для взаимодействия со сценой, mysql.connector – для работы с базой данных
1 2 |
import bpy import mysql.connector |
- Определим параметры для подключения к базе данных:
1 2 3 4 5 |
user = 'root' password = '_PASSWORD_' host = 'localhost' database = 'blender' table = 'test' |
user – пользователь базы данных MySQL. Можно указать администратора – root, или же другого, специально созданного, пользователя.
password – пароль пользователя базы данных. _PASSWORD_ необходимо заменить на реальный пароль для указанного в user пользователя.
host – указание на место размещения базы данных. Может указываться в виде адреса (www.test.ru), ip (192.168.0.1) или localhost (база размещена на локальном компьютере).
database и table – имя базы данных и таблицы в ней. Могут быть любыми.
- Создадим подключение к MySQL и курсор, через который будут выполняться запросы:
1 2 |
db = mysql.connector.connect(user=user, password=password, host=host) cursor = db.cursor() |
- Создадим базу данных с указанным выше именем (‘blender’) и выберем ее для работы:
1 2 |
cursor.execute("CREATE DATABASE IF NOT EXISTS %s DEFAULT CHARACTER SET 'utf8'" % database) db.database = database |
- Создадим таблицу в выбранной базе данных:
1 |
cursor.execute('create table if not exists %s (`name` varchar(50) NULL) engine=InnoDB' % table) |
Таблица состоит из одного текстового поля “name” на 50 символов.
- Добавим в сцену несколько разных объектов (UV Sphere, Cube и т.д.)
- shift+a – Mesh – …
- Добавим в текст скрипта запрос, который занесет в созданную выше таблицу имя выделенного объекта сцены:
1 2 |
cursor.execute("insert into {} (name) values ('%s')".format(table) % bpy.context.selected_objects[0].name) db.commit() |
По умолчанию автозавершение запросов в mysql connector отключено, поэтому после выполнения запросов insert, update и т.п. необходимо закрывать их вручную командой commit().
Если предварительно включить автозавершение,
1 |
db.autocommit = True |
выполнять завершающий commit не нужно.
- Для проверки того, что имя выделенного объекта действительно занесено в таблицу созданной базы данных, можно выполнить запрос, возвращающий ее содержимое:
1 2 3 |
cursor.execute('SELECT name FROM {}'.format(table)) for row in cursor: print(row[0]) |
После выполнения этого запроса в консоль будет последовательно выведено содержимое поля name из созданной таблицы.
- После завершения работы с MySQL необходимо закрыть созданный курсор и подключение:
1 2 |
cursor.close() db.close() |
Полный текст скрипта выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import bpy import mysql.connector user = 'root' password = '111' host = 'localhost' database = 'blender' table = 'test' db = mysql.connector.connect(user=user, password=password, host=host) cursor = db.cursor() cursor.execute("CREATE DATABASE IF NOT EXISTS %s DEFAULT CHARACTER SET 'utf8'" % database) db.database = database cursor.execute('create table if not exists %s (`name` varchar(50) NULL) engine=InnoDB' % table) cursor.execute("insert into {} (name) values ('%s')".format(table) % bpy.context.selected_objects[0].name) db.commit() cursor.execute('SELECT name FROM {}'.format(table)) for row in cursor: print(row[0]) cursor.close() db.close() |
Для проверки его работы можно несколько раз выделить в сцене разные объекты, каждый раз после выделения запуская скрипт. В результате будет создана база данных “blender”, внутри которой будет создана таблица “test”, в которую будет занесено несколько имен объектов. Финальный вывод в системную консоль будет выглядеть так: