MySQL Workbench обеспечивает расширение и систему скриптов, которая позволяет разработчику расширить возможности MySQL Workbench. В то время как ядро MySQL Workbench написано, используя C++, возможно использовать эту базовую функциональность, используя язык Python. MySQL Workbench также обеспечивает доступ к кросс-платформенной библиотеке GUI, MForms, которая позволяет создание расширений, которые показывают графический интерфейс пользователя.
Система позволяет следующие возможности:
Автоматизируйте общие задачи.
Generic RunTime (GRT) является внутренней системой, используемой MySQL Workbench, чтобы хранить данные о документе. Это также механизм, которым Workbench может взаимодействовать с модулями и плагинами. Данные модели Workbench, такие как диаграммы, схемы и таблицы, хранятся в иерархии объектов, к которым может получить доступ любой плагин. Информация представляется, используя стандартные типы данных: целые числа, числа double, строки, словари, списки и объекты.
К GRT можно получить доступ, используя язык Python. Осведомленность требуется относительно того, как типы данных GRT отображаются в Python. Например, целое число GRT и типы данных String рассматриваются как соответствующие типы данных Python. Списки и словари сохраняются в их внутреннем представлении, но можно обычно рассматривать как списки и словари Python и получать доступ обычным способом. Объекты содержат поля данных и методы, но GRT признает только объекты от предзарегистрированной иерархии классов.
Возможно полностью исследовать классы в GRT с использованием
Workbench Scripting Shell. Точки в именах классов изменяются на подчеркивания
в версиях для Python. Например, db.mysql.Table
будет db_mysql_Table в Python.
Как упомянуто ранее, данные о документе MySQL Workbench хранятся в иерархии объектов. Эта иерархия известна как GRT, к ней можно получить доступ с использованием Python или C++. Будьте осторожны, изменяя дерево GRT, поскольку ошибки могут привести к повреждению документа. Резервные копии должны быть сделаны прежде, чем управлять деревом. Доступ только для чтения к дереву это самый безопасный подход и достаточен в большинстве случаев.
Таблица C.1. Главные узлы в дереве объекта приложения
| Узел | Описание |
|---|---|
| wb.registry | Данные приложения, такие как регистрация плагинов, список редакторов и варианты. |
| wb.customData | Универсальный словарь для данных можно использовать, чтобы хранить собственные данные. Этот словарь сохраняется и перезагружается с Workbench, он глобален (не определен для документа). |
| wb.options | Содержит некоторые опции по умолчанию, которые используются Workbench. |
| wb.rdbmsMgmt | Внутренняя регистрация поддержанных модулей, известных типов данных. |
| wb.doc | В настоящее время загруженный документ. |
| wb.doc.physicalModels[0] | В настоящее время загруженный объект модели, содержит каталог базы данных и диаграммы. |
| wb.doc.physicalModels[0].catalog | Каталог базы данных для модели. Содержит список схем. |
| wb.doc.physicalModels[0]catalog.schemata | Список схем в модели. К отдельной схеме можно получить доступ как к списку: schemata[0], schemata[1] ... |
| wb.doc.physicalModels[0].catalog.schemata[0].tables (.views, .routines, ...) | Списки таблиц, представлений и подпрограмм в схеме. |
| wb.doc.physicalModels[0].diagrams | Список EER-диаграмм в модели. |
| wb.doc.physicalModels[0].diagrams[0].figures (.layers, .connections, ...) | Список рисунков, слоев и связей (отношений) в диаграмме. |
В GRT модули это библиотеки, содержащие список функций, которые экспортируются для использования кодом в других модулях, скриптах или самим Workbench. Модули могут быть написаны на C++ или Python, но типы данных, используемые для аргументов и возвращаемого значения, должны быть типами GRT.
Модули GRT подобны модулям Python, но импортируются из встроенного
модуля grt вместо внешнего файла.
Список модулей, загруженных в grt,
получен из grt.modules.
Модули могут быть импортированы в Python, используя такой запрос, как
from grt.modules import WbModel.
Чтобы экспортировать функции как модуль из кода Python, выполните следующие шаги:
Расположение файлов модуля по умолчанию:
Таблица C.2. Пользовательское расположение файла модуля по умолчанию
| Операционная система | Путь к файлу |
|---|---|
| Windows | %AppData%\MySQL\Workbench\modules |
| macOS | ~username/Library/Application Support/MySQL/Workbench/modules |
| Linux | ~username/.mysql/workbench/modules |
У имени исходного файла должно быть расширение
_grt.py, например,
my_module_grt.py.
DefineModule
из модуля wb:
from wb import * ModuleInfo = DefineModule(name='MyModule', author='Your Name', version='1.0')
Функции, которые будут экспортироваться, требуют, чтобы их подпись была объявлена. Это достигается, используя экспортного декоратора в ранее созданном объекте ModuleInfo:
@ModuleInfo.export(grt.INT, grt.STRING) def checkString(s): ...
Для запроса export тип возврата перечисляется
сначала, сопровождается входными типами параметра, определенными как имена
типов GRT. Следующие имена типов могут использоваться:
grt.INT:
Целочисленное значение. Также используемый для булевых значений.
grt.DOUBLE:
Числовое значение с плавающей запятой.grt.STRING: Строка в UTF-8 или ASCII.grt.DICT: Элемент словаря значения ключа.
Ключи должны быть последовательностями.grt.LIST: Список других значений.
Возможно определить тип содержания как кортеж в форме
(grt.LIST, <type-or-class>). Например,
(grt.LIST, grt.STRING) для списка последовательностей. Для списка объектов
таблицы было бы определено следующее:
(grt.LIST, grt.classes.db_table).grt.OBJECT:
Экземпляр объекта GRT или объект класса GRT из
grt.classes.Эти типы определяются в модуле grt, который
должен быть импортирован, прежде чем они будут доступны для использования.
Следующий фрагмент кода иллюстрирует объявление модуля, который экспортирует единственную функцию:
from wb import *
import grt
ModuleInfo = DefineModule(name='MyModule', author="your name", version='1.0')
@ModuleInfo.export(grt.DOUBLE, grt.STRING, (grt.LIST, grt.DOUBLE))
def printListSum(message, doubleList):
sum = 0
for d in doubleList:
sum = sum + d
print message, sum
return sum
Плагины это специальные модули, которые выставляются пользователю через Workbench GUI. Это, как правило, делается, используя главное меню или контекстно-зависимое меню. Большая часть функциональности MySQL Workbench осуществляется, используя плагины, например, таблица, представление и обычные редакторы это родные плагины C++, как и мастера. Средство Administrator в MySQL Workbench осуществляется полностью как плагин в Python.
Плагин может быть простой функцией, которая выполняет некоторое действие
на входе и заканчивается без дальнейшего взаимодействия с пользователем.
Примеры этого включают автоподготовку диаграммы или внесение пакетных
изменений в объекты. Чтобы создать простой плагин, функция должна быть
расположена в модуле и объявлена как плагин, используя декоратор
plugin объекта
ModuleInfo.
У плагинов может быть неопределенное время выполнения, как тогда, когда их ведет пользователь через графический интерфейс пользователя. Дело обстоит так для редакторов объектов и мастеров в MySQL Workbench. Хотя для мастера тип плагина должен быть объявлен обычным способом, только точка входа плагина должна быть выполнена в функции плагина, поскольку большая часть дополнительной функциональности будет вызвана в результате взаимодействия пользователя с GUI.
Перезагрузка плагина требует, чтобы MySQL Workbench был перезапущен.
Импортированные файлы плагинов (и их собранные коллеги) хранятся здесь:
Таблица C.3. Пользовательское расположение файла плагина
| Операционная система | Путь к файлу |
|---|---|
| Windows | %AppData%\MySQL\Workbench\modules |
| macOS | ~username/Library/Application Support/MySQL/Workbench/modules |
| Linux | ~username/.mysql/workbench/modules |
Объявите плагин, используя этот синтаксис:
@ModuleInfo.plugin(plugin_name, caption, [input], [groups], [pluginMenu])
Эти параметры определяются следующим образом:
plugin_name: уникальное имя для плагина. Это может содержать только алфавитно-цифровые символы, точки и подчеркивания.
Overview/Utility:
в Model Overview.Model/Utility: Меню для объектов диаграммы.
Menu/<category>: Подменю
в главном меню.pluginMenu:
Дополнительное название подменю в меню Plugins, где плагин должен появиться.
Например, ,
,
. Это эквивалентно добавлению
Menu/<category> в списке групп.
MySQL Workbench осуществляется с бэкендом ядра C++
и родным фронтендом для каждой поддерживаемой платформы.
В настоящее время фронтенд осуществляется с Windows Forms на
Microsoft Windows, GTK+ в Linux и с Cocoa в OS X/macOS.
Этот подход разрешает приложению иметь родной стиль, уменьшая объем работы,
требуемый, чтобы вести проект. Однако функциональность GUI, требуемая MySQL
Workbench, может быть поддержана подмножеством графических операций.
Они осуществляются в кросс-платформенной библиотеке GUI MForms.
Это уменьшает усилия по развитию, потому что разработчики плагинов могут
использовать MForms вместо того, чтобы писать фронтенд для каждой
поддерживаемой платформы. Это также помогает последовательности операции
через все платформы. MForms написан на C++, но обеспечивает интерфейс Python.
Чтобы использовать его, код Python должен импортировать модуль
mforms.
Контейнеры MForms
Учитывая проблемы использования системы абсолютной координаты с различными платформами, MForms использует контейнеры, которые выполняют автоматическое выравнивание. Основные контейнеры, которые обеспечивает MForms, включают:
Form: Окно верхнего уровня, которое может содержать единственный контроль, обычно другой контейнер. Окно будет измерено автоматически, чтобы соответствовать его содержанию, но может также быть измерено статически.
Workbench Scripting Shell обеспечивает средство для ввода и выполнения скриптов Python. С помощью оболочки скриптов MySQL Workbench может поддержать новое поведение и источники данных, используя код, написанный на Python. Оболочка может также использоваться, чтобы исследовать текущие средства Workbench Generic RunTime (GRT).
Оболочка скриптов не только полезна для расширения MySQL Workbench. Можно использовать файл скрипта из командной строки оболочки скриптов, чтобы выполнить повторяющиеся задачи программно.
У MySQL также есть продукт под названием MySQL Utilities, который отличается от Workbench Scripting Shell.
Чтобы открыть Workbench Scripting Shell, выберите , из главного меню. Можно также открыть Workbench Scripting Shell, используя Control + F3 в Windows и Linux или Command + F3 в macOS или нажимая кнопку оболочки выше навигатора диаграмм EER. Workbench Scripting Shell тогда откроется в новом диалоге.
Рис. C.1. Workbench Scripting Shell

Workbench Scripting Shell прежде всего используется для управления
скриптами Python или непосредственно печати команд в Python.
Однако можно также использовать его, чтобы получить доступ к функциям
Workbench Scripting Shell Scripting Library, глобальным функциям и объектам.
Чтобы видеть доступные команды, напечатайте
?.
Можно также вырезать и вставить текст в и из окна оболочки.
Вкладка Snippets это временная память для хранения фрагментов кода, который облегчает повторное использование и выполнение кода в MySQL Workbench.
Рис. C.2. Workbench Scripting Shell: вкладка Snippets

Открытые вкладки файла скрипта справа от вкладки
Snippets. Вкладки скрипта маркированы именем
файла скрипта или Unnamed
для отрывков без имени. Можно вырезать и вставить их
или щелкнуть правой кнопкой мыши по отрывку, чтобы открыть контекстное меню
с вариантами ,
и
.
В то время как отдельные команды могут быть введены в оболочку, также возможно управлять более длинным скриптом, сохраненным во внешнем файле, используя меню , . Когда скриптами управляют за пределами оболочки, чтобы видеть вывод, используйте меню , .
Также возможно управлять файлами скрипта непосредственно от оболочки. Для получения дополнительной информации о файлах скрипта напечатайте ? run в Workbench Scripting Shell. Следующее сообщение будет показано:
Help Topics
-----------
grt General information about the Workbench runtime
scripting Practical information when working on scripts and modules for Workbench
wbdata Summary about Workbench model data organization
modules Information about Workbench module usage
plugins Information about writing Plugins and Modules for Workbench
Type '? [topic]' to get help on the topic.
Custom Python Modules
---------------------
grt Module to work with Workbench runtime (grt) objects
grt.root The root object in the internal Workbench object hierarchy
grt.modules Location where Workbench modules are available
grt.classes List of classes known to the GRT system
mforms A Module to access the cross-platform UI toolkit used in some Workbench features
wb Utility module for creating Workbench plugins
Type 'help(module/object/function)' to get information about a module,
object or function.
Type 'dir(object)'to get a quick list of methods an object has.
For an introductory tutorial on the Python language, visit
http://docs.python.org/tutorial/
For general Python and library reference documentation, visit
http://python.org/doc/
В Workbench Scripting Shell есть пять вкладок наверху панели с левой стороны: Files, Globals, Classes, and Modules и Notifications.
Исключение брошено, пытаясь использовать
input() или читать из
stdin.
Workbench Scripting Shell показывает вкладки Files, Globals, Classes, Modules и Notifications в дополнение к главной вкладке Shell.
Вкладка Files перечисляет папки и файлы для определенных пользователями файлов скрипта. Категории файлового браузера: User Scripts, User Modules и User Libraries.
Рис. C.3. The Workbench Scripting Shell: вкладка Files

По умолчанию скрипты сохранены в каталоге
scripts/ вашего каталога конфигурации
MySQL Workbench. В следующей таблице перечислены местоположения по умолчанию
для каждой платформы.
Таблица C.4. Местоположение скриптов по умолчанию
| Операционная система | Путь scripts/ по умолчанию
|
|---|---|
| Linux | ~/.mysql/workbench/scripts |
| macOS | ~/Library/Application\
Support/MySQL/Workbench/scripts/ |
| Windows 7 |
C:\Users\[user]\AppData\Roaming\MySQL\Workbench\scripts\ |
Наверху окна список, который используется, чтобы выбрать отправную точку или корень дерева GRT Globals, показанного ниже него. По умолчанию эта отправная точка корень дерева, то есть '/'. Можно расширить или свернуть дерево GRT Globals, оно является структурой, в которой MySQL Workbench хранит данные о документе. Нажатие на любой пункт приводит к его имени и значению, показываемой в панели ниже дерева.
Рис. C.4. Workbench Scripting Shell: вкладка Globals

class это пользовательский тип данных,
сформированный, объединяя примитивные типы данных: целые числа, строки,
списки и объекты. Эта вкладка показывает определения классов, используемых
объектами во вкладке Modules.
Нажатие на класс заставляет краткое описание класса быть показанным в
панели ниже исследователя классов.
Рис. C.5. Workbench Scripting Shell: вкладка Classes

Когда выбрана вкладка Classes, список показывает следующие пункты:
Group by Name: Группировка именем объекта.
Представление по умолчанию для этой вкладки: Group By Name. Это представление показывает все различные объекты в алфавитном порядке. Щелкните значок или дважды щелкните по пакету, чтобы показать свойства структуры.
Если вы переключитесь на иерархическое представление, вы будете видеть
GrtObject: родительский объект, из которого
получены все другие объекты.
Вкладка Modules нужна, чтобы просмотреть установленные модули MySQL Workbench и их функции. Нажатие на модуль в исследователе заставляет детали быть показанными в группе ниже исследователя. Это средство полезно для исследования доступных модулей и их функций. Это также способ проверить, были ли модули правильно установлены.
Рис. C.6. Workbench Scripting Shell: вкладка Modules

Вкладка Notification включает набор
классов notification, которые используются
модулями MySQL Workbench. Щелкните по классу уведомления для
описания его использования.
Рис. C.7. Workbench Scripting Shell: вкладка Notifications
Обучающие программы в этой секции демонстрируют, как расширить MySQL Workbench, создав плагины.
MySQL Workbench включает плагин, который производит код PHP с расширением
mysqli. Эта обучающая программа показывает, как
произвести код с расширением PDO_MySQL для PHP.
Вы могли бы выбрать иное расширение или иной язык в целом, можно приспособить
произведенный код соответственно.
Чтобы начать, рассмотрите код, показанный в примере, который следует.
# import the wb module
from wb import DefineModule, wbinputs
# import the grt module
import grt
# import the mforms module for GUI stuff
import mforms
# define this Python module as a GRT module
ModuleInfo = DefineModule(name= "MySQLPDO", author= "Yours Truly", version="1.0")
@ModuleInfo.plugin("info.yourstruly.wb.mysqlpdo", caption= "MySQL PDO (Connect to Server)", input= [wbinputs.currentSQLEditor()], pluginMenu= "SQL/Utilities")
@ModuleInfo.export(grt.INT, grt.classes.db_query_Editor)
def mysqlpdo(editor):
"""Copies PHP code to connect to the active MySQL connection using PDO, to the clipboard.
"""
# Values depend on the active connection type
if editor.connection:
conn = editor.connection
if conn.driver.name == "MysqlNativeSocket":
params = {
"host" : "",
"port" : "",
"user" : conn.parameterValues["userName"],
"socket" : conn.parameterValues["socket"],
"dbname" : editor.defaultSchema,
"dsn" : "mysql:unix_socket={$socket};dbname={$dbname}"
}
else:
params = {
"host" : conn.parameterValues["hostName"],
"port" : conn.parameterValues["port"] if conn.parameterValues["port"] else 3306,
"user" : conn.parameterValues["userName"],
"socket" : "",
"dbname" : editor.defaultSchema,
"dsn" : "mysql:host={$host};port={$port};dbname={$dbname}"
}
text = """$host="%(host)s";
$port=%(port)s;
$socket="%(socket)s";
$user="%(user)s";
$password="";
$dbname="%(dbname)s";
try {
$dbh = new PDO("%(dsn)s", $user, $password));
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
""" % params
mforms.Utilities.set_clipboard_text(text)
mforms.App.get().set_status_text("Copied PHP code to clipboard")
return 0
Этот простой плагин производит код PHP, чтобы создать подключение
MySQL, используя PHP PDO_MySQL.
Определение DSN зависит от типа подключения в MySQL Workbench.
Чтобы произвести код PHP для связи, сначала установите плагин следующим образом:
php-pdo-connect_grt.py,
но можно использовать другое имя, пока есть суффикс
_grt.py.php-pdo-connect_grt.py.
Вы могли скопировать файл непосредственно в каталог плагинов вместо того, чтобы использовать интерфейс Install Plugin/Module. Результатом было бы то же самое.
.pyc) из вашего исходного файла.
В этом примере это производит файл
php-pdo-connect_grt.pyc.Caption, определенным в
рамках кода плагина.
Это действие копирует произведенный код PHP в буфер обмена на вашей системе. Следующий пример связи определяет "sakila" как базу данных по умолчанию в произведенном коде.
$host="localhost";
$port=3306;
$socket="";
$user="root";
$password="";
$dbname="sakila";
try {
$dbh = new PDO("mysql:host={$host};port={$port};dbname={$dbname}",
$user, $password));
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
Диаграммы EER полезны для визуализации сложных схем базы данных.
Они часто создаются для существующих баз данных, чтобы разъяснить их цель
или описать их. MySQL Workbench предоставляет средства для инженерного
анализа существующих баз данных и затем создания диаграммы EER автоматически.
В этом случае линии связей между внешними ключами в таблице будут
автоматически нарисованы. Это графическое представление делает отношения
между таблицаами намного легче понять. Однако более старый механизм
хранения MyISAM не включает поддержку внешних ключей. Это означает, что
таблицы MyISAM, которые перепроектированы, автоматически не покажут
линии связей между таблицами, делая базу данных тяжелее в понимании.
Плагин, созданный в этой обучающей программе, обходит эту проблему при помощи
того, что соглашение о присвоении имен часто используется для внешних ключей:
tablename_primarykeyname.
Используя это соглашение, могут автоматически быть созданы внешние ключи
после того, как база данных перепроектирована, что приведет к линиям
связей в диаграмме EER.
Логика
Основной алгоритм для этой задачи был бы следующим:
for each table in the schema
for each column in the table
look for another table whose name and primary key name
match the current column name
if such a table is found, add a foreign key referencing it
Поскольку повторение списка заполненной таблицы, чтобы найти совпадение может быть медленным для моделей с большим количеством таблиц, необходимо его оптимизировать, предварительно вычисляя все возможные имена внешнего ключа в данной схеме.
import grt
def auto_create_fks(schema):
fk_name_format = "%(table)s_%(pk)s"
possible_fks = {}
# create the list of possible foreign keys from the list of tables
for table in schema.tables:
if table.primaryKey:
format_args = {'table':table.name, 'pk':table.primaryKey.name}
fkname = fk_name_format % format_args
possible_fks[fkname] = table
# go through all tables in schema, this time to find columns that may be a fk
for table in schema.tables:
for column in table.columns:
if possible_fks.has_key(column.name):
ref_table = possible_fks[column.name]
if ref_table.primaryKey.formattedType != column.type:
continue
fk = table.createForeignKey(column.name+"_fk")
fk.referencedTable = ref_table
fk.columns.append(column)
fk.referencedColumn.append(ref_table.primaryKey)
print "Created foreign key %s from %s.%s to %s.%s" \
% (fk.name, table.name, column.name, ref_table.name,
ref_table.primaryKey.name)
auto_create_fks(grt.root.wb.doc.physicalModels[0].catalog.schemata[0])
Создание плагина из скрипта
Чтобы создать плагин из произвольного скрипта, сначала необходимо сделать файл модулем и экспортировать необходимую функцию из него. Тогда необходимо объявить модуль как плагин и определить аргументы типа возврата и входные аргументы.
from wb import *
import grt
ModuleInfo = DefineModule(name="AutoFK", author="John Doe", version="1.0")
@ModuleInfo.plugin("sample.createGuessedForeignKeys",
caption="Create Foreign Keys from ColumnNames",
input=[wbinputs.objectOfClass("db.mysql.schema")],
groups=["Overview/Utility"])
@ModuleInfo.export(grt.INT, grt.classes.db_mysql_Schema)
def auto_create_fks(schema):
...
С добавлением предыдущего кода функция
auto_create_fks() экспортируется и будет
добавлена к контекстному меню схемы. Когда вызвана, она получает в настоящее
время выбранную схему как свой вход.