Хранение информации в удаленной базе данных стало обычной практикой при разработке программных продуктов. 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”, в которую будет занесено несколько имен объектов. Финальный вывод в системную консоль будет выглядеть так:
тема интересная, но кроме названия объекта, что еще можно записать в БД? сам объект как туда поместить?
В базу можно поместить все, что угодно. Сам объект – это набор координат точек и полигонов в определенном порядке, доступный через свойство data. По нему можно пройтись и точно так же сохранить эти данные в базе.
>> При написании скриптов и аддонов, разработчик может столкнуться с
необходимостью обращения к базе данных, чтобы получить из нее или
записать в нее необходимые данные.
есть какой-нибудь живой пример такой необходимости? ты сам используешь БД для хранения 3D объектов или отдельных свойств data?
мне это интересно, делаю инфографику на карту, хочу воспользоваться твоим советом по связке MySQL и Blender
может у тебя есть еще материал на эту тему?
Я пока постепенно разбираюсь в процессе. А какие советы еще нужны? В принципе в статье рассмотрено все – подключение, создание базы/таблиц, запросы вида insert и select.