Генератор кода
Перейдите на вкладку Code Generator на панели инструментов. Слева на вкладке отображается код всего документа, а справа от него — панель параметров с заголовком Code Generator, на которой выбираются язык, база данных, стили имен и, для некоторых целевых форматов, кавычки.
Панель открывается сама, если при первом открытии вкладки ширина редактора не меньше 640 px. Кнопка Hide options в верхней части панели сворачивает ее, а кнопка Show options в правом верхнем углу кода снова ее открывает. Панель остается открытой или свернутой при переключении вкладок, пока открыт редактор, независимо от панели вкладки «Схема SQL», и это состояние никогда не сохраняется в файле.
Щелкните код правой кнопкой мыши, чтобы открыть его контекстное меню: пункты Language, Database, Table Name Case, Column Name Case, Bracket (только для Doctrine, JPA и SeaORM), каждый с подменю, в котором отмечено текущее значение, затем пункт Options panel, который сворачивает или открывает панель и отмечен, пока она отображается, и пункт Save file.
Пока открыта эта вкладка, Быстрый поиск предлагает команды Database, Bracket (только для Doctrine, JPA и SeaORM), Language, Table Name Case, Column Name Case и Code Generator: Options panel, которая сворачивает или открывает панель.

Это же представление кода служит и вкладкой Code Generator в окне «Свойства таблицы», где оно генерирует код только для этой таблицы, а не для всего документа. Панели параметров там нет, а его контекстное меню меняет те же настройки, но в нем нет пунктов Options panel и Save file.
Если код всего документа начинается с импортов или заголовка, код одной таблицы начинается с тех из них, которые нужны этой таблице, например <?php для PHP, import Foundation для Swift или $schema для JSON Schema.
Код формируется при открытии вкладки и заново при каждом изменении языка, базы данных, стиля имен или кавычек. Правка диаграммы, сделанная, пока вкладка открыта, например правка соавтора или агента для программирования, отображается, когда вы уйдете с вкладки и вернетесь на нее или когда изменится одна из этих настроек.
Панель параметров
Под подписью Saved in the document на панели перечислены Language, Database, Table Name Case и Column Name Case, а за ними — Bracket, пока в качестве языка выбран Doctrine, JPA или SeaORM. Каждый из них — раскрывающийся список, и изменение сразу же переписывает код.
Если выбранный язык не учитывает Database или стили имен, они остаются на панели приглушенными, с пометкой под ними, например Not used by DBML, и их по-прежнему можно изменить.
Кнопки Save file и Copy находятся внизу панели — см. Сохранение и копирование результата.
Это собственные настройки диаграммы — те же, которые также меняются через контекстное меню и Быстрый поиск. Настройка Database сохраняется в файле, как и любая правка.
Настройки Language, Table Name Case, Column Name Case и Bracket сохраняются, только пока их блокировка на вкладке «Настройки» выключена (для Bracket — блокировка Bracket Type), а в новой диаграмме включены все блокировки. Пока блокировка включена, изменение переписывает код на экране, но в файле остается заблокированное значение, и при повторном открытии диаграммы используется именно оно. Панель никак не показывает блокировку; чтобы сохранить выбор в файле, выключите соответствующую блокировку — см. Блокировка.
Язык
Поддерживаются двадцать два целевых формата в трех группах — языки, ORM, затем схемы, — и внутри каждой группы они перечислены в алфавитном порядке. Список на панели и контекстное меню разделяют группы линией, но не называют ни одну из них:
| Целевой формат | Группа | Связи | Индексы | ON DELETE / ON UPDATE | Сохраняется как |
|---|---|---|---|---|---|
C# | Язык | — | — | — | .cs |
Go | Язык | — | — | — | .go |
Java | Язык | — | — | — | .java |
Kotlin | Язык | — | — | — | .kt |
PHP | Язык | — | — | — | .php |
Rust | Язык | — | — | — | .rs |
Scala | Язык | — | — | — | .scala |
Swift | Язык | — | — | — | .swift |
TypeScript | Язык | — | — | — | .ts |
Doctrine | ORM | ✓ | ✓ | Только ON DELETE | .php |
Drizzle | ORM | ✓ | ✓ | ✓ | .ts |
JPA | ORM | ✓ | — | — | .java |
SeaORM | ORM | ✓ | Только уникальные | ✓ | .rs |
Sequelize | ORM | ✓ | ✓ | ✓ | .ts |
SQLAlchemy | ORM | ✓ | ✓ | ✓ | .py |
TypeORM | ORM | ✓ | ✓ | ✓ | .ts |
AML | Схема | ✓ | ✓ | ✓ | .aml |
DBML | Схема | ✓ | ✓ | ✓ | .dbml |
GraphQL | Схема | ✓ | — | — | .graphql |
JSON Schema | Схема | — | — | — | .json |
Mermaid | Схема | ✓ | — | — | .mmd |
Zod | Схема | — | — | — | .ts |
По умолчанию выбран GraphQL. Каждый целевой формат выводит столбцы; отметки ✓ показывают, что еще он выводит.
Таблицы выводятся в порядке имен, а не в том порядке, в котором они расположены на холсте, а индексы — это те, что перечислены в группе Indexes окна «Свойства таблицы», а не строки группы Keys над ними. SeaORM записывает только уникальные индексы, а Mermaid помечает уникальный столбец как UK, но не записывает индексы.
Все целевые форматы, кроме Java, AML, DBML и Mermaid, записывают столбец первичного ключа как не допускающий NULL независимо от того, установлен ли для него флаг Not Null. Java не помечает ни один столбец ни как допускающий NULL, ни как не допускающий, а AML, DBML и Mermaid сохраняют флаг таким, каким он задан в диаграмме.
Что записывают некоторые целевые форматы:
PHP: простые классы с типизированными публичными свойствами, а в начале кода —<?phpиdeclare(strict_types=1);.Doctrine: сущности Doctrine ORM 3 с атрибутами, рассчитанные на DBAL 4.2 или новее, где у каждого столбца указаны его тип DBAL и параметры для выбранной базы данных.Rust: по одной структуреpub structна таблицу, типы в которой записаны полным путем, напримерchrono::NaiveDateTimeилиrust_decimal::Decimal, без строкиuse.SeaORM: сущности SeaORM 2.0 в плотном формате, где каждая таблица — отдельныйpub mod, поэтому весь текст компилируется как один файл.Swift: по одной структуреCodable,Hashable,Sendableна таблицу, что требует Swift 6.1 или новее.TypeScript: по одному интерфейсуexport interfaceна таблицу, описывающему строку в виде JSON так же, как схемаZod, — дата или время имеет типstring, а столбец, допускающий NULL, — типT | null.Zod: по одной схеме строки Zod 4 на таблицу вместе с выводимым из нее типом, без схемы вставки и без связей.JSON Schema: один документ JSON Schema draft 2020-12 со схемой строки для каждой таблицы в$defs.Mermaid: диаграммаerDiagramтого вида, который отображает GitHub, где каждая таблица — сущность со всеми ее столбцами, их типами и меткамиPK,FKилиUK, если они есть, а каждая связь — линия между двумя ее таблицами.
AML, DBML и GraphQL поддерживают обмен в обе стороны: каждый из них также служит источником импорта. См. Импорт и экспорт файлов. Остальные схемы — JSON Schema, Mermaid и Zod — служат только для вывода.
DBML записывает цвет каждой таблицы как headercolor, а в коде всего документа — блок TableGroup после определений Ref для каждой группы таблиц, в которой есть таблица. AML записывает цвет таблицы как ближайшее из имен цветов AML.
ON DELETE и ON UPDATE
Действия ON DELETE и ON UPDATE связи задаются через ее контекстное меню — см. ON DELETE и ON UPDATE.
Целевые форматы с отметкой ✓ в столбце ON DELETE / ON UPDATE таблицы в разделе Язык записывают действия, заданные в связи; для действия со значением Not set ничего не записывается.
Какие действия сохраняют целевые форматы ORM, зависит от выбранной базы данных, тогда как AML и DBML сохраняют все — см. База данных.
Doctrineзаписывает только ON DELETE, так как в Doctrine нет ON UPDATE. Он добавляетonDelete: 'CASCADE'к каждому#[ORM\JoinColumn]уManyToOneилиOneToOneвладеющей стороны, например#[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')], и ничего не добавляет кOneToManyилиOneToOneобратной стороны. Связь с уникальным столбцом, который не является первичным ключом, остается в виде обычных столбцов, которые Doctrine отображает без ассоциации, поэтому действие для нее не записывается.Drizzleзаписывает их в нижнем регистре. В.references()это параметры, например{ onDelete: "cascade", onUpdate: "set null" }, а вforeignKey(), который создается для ключа из нескольких столбцов, — цепочка вызовов, например.onDelete("restrict").onUpdate("no action").SeaORMзаписывает их в связиbelongs_toдочерней таблицы, сначала ON UPDATE, под именами SeaORMNoAction,Cascade,SetNull,SetDefaultиRestrict, напримерon_update = "Cascade", on_delete = "SetNull". Вhas_oneилиhas_manyродительской таблицы они не записываются.Sequelizeзаписывает элементыonDelete: "CASCADE"иonUpdateв оба вызова ассоциаций:hasManyилиhasOneиbelongsTo. Для ключа из нескольких столбцов вызовы ассоциаций не создаются, поэтомуSequelizeне записывает для него действия.SQLAlchemyпередает аргументыondelete="CASCADE"иonupdateвForeignKey()для ключа из одного столбца и вForeignKeyConstraint()для ключа из нескольких столбцов.TypeORMзаписывает параметрыonDelete: "CASCADE"иonUpdateв@ManyToOneили@OneToOneвладеющей стороны и никогда не записывает их на обратной стороне. Он всегда опускаетSET DEFAULT, потому что TypeORM записал бы его какDEFAULT, а такое значение не принимает ни одна база данных.DBMLдобавляет к определениюRefнастройки, например[delete: set null, update: no action].AMLзаписывает связь, у которой есть действие, отдельным операторомrelсо свойствами, например{onDelete: cascade, onUpdate: "set null"}, а не прямо в описании ее столбца.
JPA не записывает ни одного действия: в чистом JPA для них нет параметра, а генератор не использует @OnDelete из Hibernate. Mermaid тоже их не записывает, так как в линии erDiagram для них нет места.
На вкладке Code Generator окна «Свойства таблицы», где показана одна таблица, DBML не записывает определений Ref, а AML — операторов rel, поэтому ни один из них не показывает там действия; связь по одному столбцу, у которой есть действия, AML оставляет прямо в описании ее столбца, как и связь без них. Mermaid там вообще не записывает линий связи. Doctrine и SeaORM записывают там ту же сущность, что и для всего документа, включая действия.
Стиль имен
Каждый из параметров Table Name Case и Column Name Case поддерживает значения Pascal, Camel, Snake и None.
По умолчанию для имен таблиц используется Pascal, а для имен столбцов — Camel. При значении None имя выводится в том виде, в каком оно записано в диаграмме.
При любом стиле имя, зарезервированное языком целевого формата, экранируется там, где язык это допускает, например @class в C# или r#type в Rust, и переименовывается там, где не допускает, например class_ в Java.
AML, DBML и Mermaid не учитывают ни одну из этих настроек и всегда выводят имена из диаграммы.
SeaORM тоже их не учитывает: он именует поля и модули в стиле snake case — в той форме, которую SeaORM читает обратно, — а хранимые имена указывает в table_name и, если они отличаются, в column_name.
Для этих четырех целевых форматов панель приглушает оба списка и показывает под ними пометку Not used by.
База данных
Типы данных определяются по выбранной базе данных — см. Базы данных.
Выберите ее на этой вкладке в списке Database на панели, в пункте Database контекстного меню или в Быстром поиске, и код сразу же перепишется. Это единственная настройка базы данных в диаграмме — та же, которую задают контекстное меню холста и вкладка «Схема SQL», поэтому изменение здесь отражается и там.
Drizzle берет диалект из этой же настройки: pgTable для PostgreSQL, mysqlTable для MySQL и MariaDB, sqliteTable для SQLite и pgTable для всех остальных баз данных.
SeaORM записывает column_type там, где SeaORM иначе создал бы столбец другого типа в PostgreSQL, MySQL, MariaDB или SQLite, и не записывает его для MSSQL, Oracle, Snowflake или Databricks, для которых у SeaORM нет бэкенда.
Выбранная база данных также определяет, какие действия ON DELETE и ON UPDATE записывают целевые форматы ORM.
Doctrine, SeaORM, Sequelize, SQLAlchemy и TypeORM опускают любое действие, опускаемое в Схеме SQL этой базы данных, например SET DEFAULT в MySQL и MariaDB, RESTRICT в MSSQL или все действия, кроме NO ACTION, в Snowflake и Databricks, поэтому действует поведение базы данных по умолчанию. Полный список приведен в разделе ON DELETE и ON UPDATE.
Drizzle вместо этого ориентируется на диалект, в котором записывает код: код с mysqlTable опускает SET DEFAULT, а код с pgTable и sqliteTable сохраняет все действия, включая код с pgTable, который записывается для MSSQL, Oracle, Snowflake и Databricks.
Исключение составляют AML, DBML и Mermaid: они выводят каждый тип данных в том виде, в каком он записан в диаграмме, поэтому настройка базы данных не влияет на их вывод, и панель приглушает для них список Database. AML и DBML записывают все действия, заданные в связи, а Mermaid не записывает ни одного.
Кавычки
Параметр Bracket предлагается на панели, в контекстном меню и в Быстром поиске, только пока в качестве языка выбран Doctrine, JPA или SeaORM.
Это та же настройка, что и кавычки на вкладке «Схема SQL», — см. Схема SQL, — поэтому изменение здесь меняет и то, как Схема SQL заключает имена в кавычки. Она предлагает значения SingleQuote, DoubleQuote, Backtick и None, а изначально имеет значение None.
Doctrine: при любых кавычках, кромеNone, каждое имя таблицы, столбца и столбца соединения заключается в обратные кавычки — так Doctrine помечает имя, которое нужно взять в кавычки, например#[ORM\Table(name: '`order`')]. При значенииNoneв них заключается только то имя, которому это нужно: слово, зарезервированное базой данных, имя, не являющееся простым идентификатором ASCII, или имя, введенное в кавычках.JPA: при любых кавычках, кромеNone, имя таблицы, являющееся зарезервированным словом, заключается в кавычки внутри@Table, например@Table(name = "\"user\""). При значенииNoneоно остается без кавычек, как и в Схеме SQL.SeaORM: при значенииNoneимена записываются так, как их хранит база данных: имя таблицы с точкой разделяется наschema_nameиtable_name, а в PostgreSQL имя без кавычек приводится к нижнему регистру. При любых других кавычках имя сохраняется целиком, как записано.
Сохранение и копирование результата
Команда Save file внизу панели параметров или в контекстном меню сохраняет отображаемый код в файл.
Как и любой экспортируемый файл, он получает имя <database name>-<timestamp>, за которым следует расширение из таблицы в разделе Язык, например shop-2026-10-12T04_05_06.ts, и сохраняется туда же, куда и любой экспорт в приложении-хосте, — см. Экспорт. Java и JPA помещают все классы в один файл .java, как они показаны на вкладке.
В меню Export нет пункта для Генератора кода, а вкладка Code Generator окна «Свойства таблицы» не может сохранить файл.
Чтобы скопировать код, нажмите кнопку Copy внизу панели либо наведите указатель на код и нажмите кнопку копирования в его правом верхнем углу — это единственный способ в окне «Свойства таблицы».
Уведомление Copied! с галочкой подтверждает копирование в течение двух секунд. Если браузер или хост отказывает в доступе к буферу обмена, вместо него об этом сообщает уведомление Couldn't copy to the clipboard со значком предупреждения. Повторное копирование заменяет уведомление, а не добавляет еще одно.
Текст также можно выделить, чтобы взять только нужную часть.