Перейти до основного вмісту

Генератор коду

Перейдіть на вкладку 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, що згортає або відкриває панель.

Вибір TypeScript, а потім Rust, у контекстному меню коду, перемикання назв стовпців на Snake на панелі параметрів і копіювання коду

Те саме подання коду є також вкладкою 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
DoctrineORM✓✓Лише ON DELETE.php
DrizzleORM✓✓✓.ts
JPAORM✓——.java
SeaORMORM✓Лише унікальні✓.rs
SequelizeORM✓✓✓.ts
SQLAlchemyORM✓✓✓.py
TypeORMORM✓✓✓.ts
AMLСхема✓✓✓.aml
DBMLСхема✓✓✓.dbml
GraphQLСхема✓——.graphql
JSON SchemaСхема———.json
MermaidСхема✓——.mmd
ZodСхема———.ts

Типове значення — GraphQL. Кожен цільовий формат виводить стовпці; позначки ✓ показують, що ще він виводить.
Таблиці виводяться в порядку їхніх назв, а не в порядку розташування на полотні. Індекси — це ті, що перелічені під Indexes у вікні властивостей таблиці, а не рядки Keys над ними. SeaORM записує лише унікальні з них, а Mermaid позначає унікальний стовпець як UK, але не записує жодного індексу.
Кожен цільовий формат, крім Java, AML, DBML і Mermaid, записує стовпець первинного ключа як NOT 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 у щільному форматі (dense), де кожна таблиця — модуль 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, під назвами SeaORM NoAction, 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 зі знаком попередження. Повторне копіювання замінює сповіщення, а не додає ще одне.
Текст також можна виділяти, щоб узяти лише потрібну вам частину.