Spec-Zone.ru › MySQL Workbench

C.6.2 Учебное пособие: Генерация внешних ключей с MyISAM

Диаграммы ER полезны для визуализации сложных схем баз данных. Они часто создаются для существующих баз данных, чтобы прояснить их назначение или задокументировать их. MySQL Workbench предоставляет средства для обратной инжиниринга существующих баз данных и последующего автоматического создания диаграммы ER. В этом случае линии взаимосвязей между внешними ключами в таблице будут автоматически нарисованы. Это графическое представление значительно упрощает понимание взаимосвязей между таблицами. Однако более старая система хранения MyISAM не поддерживает внешние ключи. Это означает, что для таблиц MyISAM, которые были обработаны с помощью обратной инжиниринга, линии взаимосвязей между таблицами не будут автоматически нарисованы, что затрудняет понимание базы данных. Плагин, созданный в этом руководстве, решает эту проблему, используя тот факт, что для внешних ключей часто используется соглашение об именовании: tablename_primarykeyname. Используя это соглашение, внешние ключи могут быть автоматически созданы после обратной инжиниринга базы данных, что приведет к отображению линий взаимосвязей на диаграмме ER.

Алгоритм

Основной алгоритм для этой задачи следующий:

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() экспортируется и будет добавлена в контекстное меню схемы в обзоре модели. При вызове она получает текущую выбранную схему в качестве входных данных.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/workbench-en/wb-tutorial-plugins-myisam-fk.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API