Перейти к основному содержимому

Импорт и экспорт файлов

Импорт внешних файлов​

Из подменю Import контекстного меню холста можно импортировать файлы пяти форматов:

  • json
  • Schema SQL
  • GraphQL
  • DBML
  • AML

Пункт Import and Add, расположенный сразу под Import, добавляет файл в диаграмму, а не заменяет ее — см. Импорт с добавлением.
На экране приветствия, который отображается для пустой диаграммы, есть пункт Import с теми же пятью форматами — см. Экран приветствия.

Расширения сравниваются без учета регистра. Если выбрать файл, расширение которого не соответствует выбранному формату, импорт отменяется и отображается сообщение Only <format> files can be imported, где формат записан как json, sql, graphql, dbml или aml, например Only sql files can be imported.

Пункт Import заменяет текущий документ, а не объединяет файл с ним, и одна отмена возвращает предыдущую диаграмму.
JSON-файл приносит с собой собственные настройки, включая блокировки. Если в файле заблокированы вкладка, язык Генератора кода, стиль имен или тип кавычек, на экране остается то, что было, но сохраняется заблокированное значение из файла. Вид, заблокирован он или нет, устанавливается так, как задано в файле. JSON-файл, сохраненный до появления блокировок, загружается со всеми включенными блокировками и видом в масштабе 100%.
Остальные форматы сохраняют текущие настройки, включая блокировки, за исключением вида, который открывается в масштабе 100%.
Парсеры GraphQL, DBML и AML никогда не завершаются с ошибкой: файл, который они не могут прочитать, дает пустую диаграмму, а не ошибку.

JSON-файл сохраняет имеющиеся в нем позиции. Таблицы из файла Схемы SQL, GraphQL, DBML или AML размещаются до того, как диаграмма изменится:

  • Если в файле две таблицы или больше и хотя бы одна связь, они размещаются Автоматическим размещением в режиме Flow слева направо вдоль связей, начиная с левого верхнего угла холста. Связь таблицы с самой собой тоже учитывается.
  • В остальных случаях они выстраиваются рядами от левого верхнего угла, причем первыми идут таблицы с наименьшим числом столбцов.
  • Если размещение длится дольше 6 секунд, появляется уведомление Placing tables с кнопкой Cancel. Кнопка Cancel или клавиша Escape, нажатая, пока уведомление на экране, прерывает размещение, и таблицы вместо этого выстраиваются рядами. Рядами таблицы выстраиваются и без уведомления, если размещение завершается сбоем, если результат размещения не возвращается в течение 60 секунд или если хост не запускает общий воркер, — см. Web Worker.

Затем диаграмма заменяется за один шаг, поэтому промежуточное состояние не отображается. Настройка, измененная во время размещения таблиц, например вкладка, сохраняется, а если за это время импортировать другой файл, применяется импорт, запущенный последним.

В редакторе только для чтения пункт Import ничего не загружает, а пункт Import and Add не предлагается.

Импорт с добавлением​

Пункт Import and Add сохраняет диаграмму и добавляет файл под ней. Он есть в контекстном меню холста и в Быстром поиске на вкладке ERD и предлагает те же пять форматов с той же проверкой расширения, что и Import.

Добавление SQL-файла через Import and Add &gt; Schema SQL: его таблицы появляются под диаграммой, размещенные вдоль связей и выделенные

Файл добавляется так же, как при вставке: все таблицы, столбцы, связи, индексы, заметки и группы таблиц из файла добавляются как новые, таблицы, уже имеющиеся в диаграмме, не перемещаются, а настройки не меняются, поэтому настройки JSON-файла не применяются.
Таблица, имя которой уже есть в диаграмме, добавляется как вторая таблица с этим именем, а не объединяется с существующей. Связи и индексы берутся только из файла, поэтому внешний ключ на таблицу, которая не определена в файле, не связывается с таблицей, уже имеющейся в диаграмме.

Добавленный блок помещается сразу под всем содержимым диаграммы с выравниванием по ее левому краю, а в пустой диаграмме — в левый верхний угол. Заметки и группы таблиц, скрытые в Параметрах вида, тоже учитываются, так как они по-прежнему занимают свое место.
Внутри блока JSON-файл сохраняет собственное расположение элементов, включая группы таблиц. Остальные форматы размещаются так же, как их размещает пункт Import: в режиме Flow или рядами по тем же правилам, а рамка каждой группы таблиц подгоняется под ее таблицы. Добавленные таблицы и заметки ложатся поверх всего, что уже было в диаграмме.

Когда блок помещен, выделяется только добавленное: новые таблицы, а также новые заметки и группы таблиц, если они отображаются. Если за это время вы перешли на другую вкладку, редактор возвращается на вкладку ERD до того, как блок будет помещен. Затем вид прокручивается к блоку в текущем масштабе, если только блок уже не виден достаточно хорошо, — см. Куда ведет переход. Одна отмена убирает все добавленное целиком.
Файл, который парсер не может прочитать, или файл без таблиц и заметок ничего не добавляет.

Если добавить несколько файлов Схемы SQL, GraphQL, DBML или AML, пока один из них еще размещается, помещаются все они — в том порядке, в котором было начато их добавление. JSON-файл, добавленный за это время, помещается сразу после чтения, раньше них. Импорт через пункт Import или загрузка другого документа отбрасывает все файлы, размещение которых еще не завершено.

Агенты для программирования добавляют файл так же с помощью режима append инструментов импорта MCP, который сохраняет расположение элементов JSON-файла, но таблицы остальных форматов выстраивает рядами и никогда не размещает в режиме Flow — см. Импорт.

JSON​

Можно импортировать файлы в формате схемы, определенном в редакторе. Имя файла должно оканчиваться на .json, поэтому файл, экспортированный как <database name>-<timestamp>.erd.json, импортируется обратно без изменений; файл с расширением только .erd или .vuerd здесь не принимается. Файлы, сохраненные более ранними версиями, тоже читаются.

Импорт сохраненного файла через Import &gt; json с заменой чернового документа вместе с его настройками

Схема SQL​

Можно также импортировать файлы схем, описанных на SQL.
Хотя парсеры сделаны максимально гибкими независимо от СУБД, некоторые синтаксические конструкции могут не поддерживаться.
Имя файла должно оканчиваться на .sql.
Поддерживаемый синтаксис можно посмотреть здесь.

Импорт SQL-файла через Import &gt; Schema SQL, размещение его таблиц вдоль связей, затем уменьшение масштаба, чтобы охватить их

Столбцы берутся только из операторов CREATE TABLE. Столбец, добавленный через ALTER TABLE ... ADD COLUMN, не читается.
Элементы оператора CREATE TABLE, которые не являются столбцами, пропускаются, а не читаются как столбцы: безымянный CHECK (...), LIKE и EXCLUDE в PostgreSQL, FULLTEXT и SPATIAL в MySQL, записанные без INDEX или KEY, PERIOD FOR в T-SQL и SUPPLEMENTAL LOG DATA в Oracle.
Столбец с именем, совпадающим с одним из них, все равно импортируется, если за именем следует встроенный тип, как в exclude BOOLEAN, или если имя взято в кавычки, как в "check" int. Слово like без кавычек, за которым следует невстроенный тип, например like citext, читается как LIKE из PostgreSQL и пропускается.
Сами ограничения CHECK не импортируются, так как в редакторе нет места для их хранения.

Типы данных​

Тип данных столбца сохраняется вместе со списком аргументов, даже если это не встроенный тип ни одной из поддерживаемых баз данных.
Это относится к перечислениям и составным типам, созданным через CREATE TYPE, доменам, созданным через CREATE DOMAIN, типам расширений, например hstore, citext и ltree, именам с указанием схемы, например public.mood, и именам в кавычках или квадратных скобках, например "MyType" и [dbo].[Phone], которые сохраняют свои кавычки или скобки. Сами операторы CREATE TYPE, CREATE DOMAIN и CREATE EXTENSION пропускаются.
У встроенного типа кавычки или скобки убираются, поэтому [int] импортируется как int, а [nvarchar](50) — как nvarchar(50). Типы "char" и "bit" в PostgreSQL сохраняют свои кавычки, потому что это типы, отличные от char и bit.
Суффиксы массивов сохраняются у любого типа: integer[], text[3][3], integer ARRAY, mood[]. Тип UNSIGNED BIG INT из SQLite импортируется целиком.
Модификаторы UNSIGNED и ZEROFILL из MySQL и MariaDB, записанные сразу после типа и его аргументов, остаются частью типа в том виде, в каком написаны: INT UNSIGNED, SMALLINT(5) UNSIGNED ZEROFILL, int unsigned из mysqldump. Модификатор SIGNED, действующий по умолчанию, отбрасывается, поэтому TINYINT SIGNED импортируется как TINYINT. Модификатор, записанный после другого параметра столбца, как в записи INT NOT NULL UNSIGNED, которую MySQL не принимает, отбрасывается.
Значения ENUM(...) и SET(...) сохраняют свои кавычки, а кавычка внутри значения удваивается, как в ENUM('a','it''s'). Экранированная обратной косой чертой запись 'it\'s' из MySQL импортируется с таким же удвоением. В типе STRUCT<...> из Databricks имена полей в кавычках и параметр COMMENT поля сохраняют свои кавычки.
Столбец, записанный без типа, например столбец SQLite без типа или вычисляемый столбец AS, остается без типа: ключевое слово, например NOT, NULL, DEFAULT, PRIMARY или REFERENCES, либо строка в одинарных кавычках не читается как тип.

Значения по умолчанию​

Значение DEFAULT столбца сохраняет выражение целиком, например now(), 0.5, CURRENT_TIMESTAMP или ARRAY[]::text[], вплоть до следующего параметра столбца, запятой или закрывающей скобки. Конструкция CASE ... END читается целиком.
Скобки вокруг всего выражения убираются, поэтому ((0)) из SQL Server импортируется как 0, а (getdate()) — как getdate(). Приведение типа литерала тоже убирается, поэтому 'draft'::character varying из pg_dump импортируется как 'draft', а NULL::character varying — как NULL; другие приведения типов сохраняются, как в ARRAY[]::text[] и lower('A'::text).
Атрибут ON UPDATE CURRENT_TIMESTAMP из MySQL отбрасывается, так как в столбце для него нет места, а значение по умолчанию перед ним сохраняется. Запись DEFAULT ON NULL 0 из Oracle, с FOR INSERT ONLY либо FOR INSERT AND UPDATE или без них, импортируется как 0.
Строка с префиксом, например N'x', E'x', B'0', X'ff', U&'x' или _utf8mb4'x', читается как одна строка, даже если внутри нее есть скобка.

SQL Server Management Studio записывает значения по умолчанию в скрипт после таблиц в виде ALTER TABLE [dbo].[t] ADD CONSTRAINT [DF_x] DEFAULT ((1)) FOR [col]. Такой оператор задает значение по умолчанию этого столбца, в данном случае 1, а имя его ограничения отбрасывается.

Экспорт Схемы SQL возвращает скобки для тех баз данных, которые читают выражение значения по умолчанию только внутри скобок, — см. Значения по умолчанию.

Автоинкремент​

Ключевые слова AUTO_INCREMENT, AUTOINCREMENT и IDENTITY включают у столбца флаг Auto Increment, как и конструкции GENERATED ALWAYS AS IDENTITY и GENERATED BY DEFAULT AS IDENTITY, которые не оставляют значения по умолчанию.
Так же действует значение по умолчанию из единственного вызова nextval() в PostgreSQL (такое значение по умолчанию получает столбец типа serial), записанное как nextval('s') или, как его записывает pg_dump, nextval('s'::regclass). Имя последовательности не сохраняется. Значение по умолчанию, которое лишь использует последовательность, например nextval('s') + 1 или NEXT VALUE FOR s в SQL Server, остается обычным значением по умолчанию.
pg_dump записывает оба варианта после таблиц в виде ALTER TABLE [ONLY] t ALTER [COLUMN] c SET DEFAULT nextval('s'::regclass) и ALTER TABLE t ALTER [COLUMN] c ADD GENERATED ... AS IDENTITY. Любой из этих операторов включает у этого столбца флаг Auto Increment и очищает его значение по умолчанию. Операторы CREATE SEQUENCE, ALTER SEQUENCE и все остальные действия ALTER COLUMN пропускаются.
Столбец, тип которого указан прямо в определении как serial, bigserial или smallserial, сохраняет этот тип, а флаг Auto Increment остается выключенным.

Редактор хранит только флаг Auto Increment, а при экспорте каждая база данных записывает собственную форму — см. Автоинкремент. Экспорт для PostgreSQL записывает GENERATED ALWAYS AS IDENTITY для столбца типа smallint, integer или bigint, какая бы форма ни была импортирована, а для любого другого типа, например INT UNSIGNED, — только строку комментария после таблицы. Параметры последовательности, например START WITH 100, теряются.
Таблица с несколькими столбцами serial или identity импортируется с несколькими автоинкрементными столбцами, а MySQL, MariaDB и SQL Server отвергают такую таблицу, когда выполняется ее экспортированный SQL.

Первичные ключи​

Первичный ключ, добавленный после таблицы оператором ALTER TABLE t ADD [CONSTRAINT n] PRIMARY KEY (...), помечает свои столбцы как первичный ключ.
Ключевые слова CLUSTERED или NONCLUSTERED из SQL Server и USING BTREE из MySQL перед списком столбцов пропускаются при чтении, поэтому оператор ALTER TABLE [dbo].[Users] ADD CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([Id] ASC) WITH (...) ON [PRIMARY], который записывает SQL Server Management Studio, делает ключом столбец Id. Конструкция PRIMARY KEY NONCLUSTERED HASH (...) таблицы, оптимизированной для памяти, не читается ни в ALTER TABLE, ни в CREATE TABLE.

Уникальные ключи и индексы​

Ограничение UNIQUE на два столбца или больше становится одним уникальным индексом при любой записи: UNIQUE (a, b), UNIQUE KEY n (a, b), UNIQUE INDEX n (a, b), CONSTRAINT n UNIQUE (a, b), встроенная запись SQL Server INDEX n UNIQUE (a, b) и ALTER TABLE t ADD [CONSTRAINT n] UNIQUE (a, b).
Индекс получает имя индекса ключа, при его отсутствии — имя из CONSTRAINT, а при отсутствии обоих остается без имени; порядок сортировки каждого столбца сохраняется. Такой индекс является альтернативным ключом.
Ограничение UNIQUE на один столбец при любой из этих записей вместо этого устанавливает для столбца флаг «Уникальный» и не добавляет индекс, поэтому ограничение UQ_<table name>_<column name>, которое записывает экспорт, возвращается в виде флага, из которого оно было записано. Оператор CREATE UNIQUE INDEX на один столбец остается уникальным индексом.

Оператор ALTER TABLE, добавляющий сразу несколько ключей, например ADD PRIMARY KEY (id), ADD UNIQUE KEY uq_a (a, b), ADD UNIQUE KEY uq_c (c) в записи phpMyAdmin, сохраняет все содержащиеся в нем уникальные ключи: uq_a импортируется как уникальный индекс с именем uq_a, а uq_c — как флаг «Уникальный» столбца c. Имя из CONSTRAINT относится только к ключу в его собственном предложении. Также читаются ADD UNIQUE INDEX IF NOT EXISTS n (...) из MariaDB и ALTER TABLE t WITH CHECK ADD ... и WITH NOCHECK ADD ... из SQL Server.
Операторы CREATE INDEX и CREATE UNIQUE INDEX читаются с полными именами, например public.t и [dbo].[t], с CLUSTERED и NONCLUSTERED из SQL Server, с CONCURRENTLY, IF NOT EXISTS, ON ONLY и USING btree из PostgreSQL, а также совсем без имени индекса. Файловая группа ON [PRIMARY] из SQL Server игнорируется.
Параметры ключа, например NULLS NOT DISTINCT или USING BTREE, не принимаются за имя ключа. В списке столбцов ключа столбец обозначает только первое слово, поэтому во всех записях b DESC NULLS LAST, b text_pattern_ops и b COLLATE "C" ключом становится столбец b, а DESC сохраняется как его порядок сортировки. Длина префикса, например email(191), пропускается при чтении, но ключ, в который входит выражение, например lower(email), пропускается целиком.

Частичный уникальный индекс, CREATE UNIQUE INDEX ... WHERE ... или встроенный INDEX n UNIQUE (...) WHERE ... в SQL Server, импортируется как обычный индекс с тем же именем и столбцами, потому что ключ, уникальный по всей таблице, был бы строже отфильтрованного ключа, объявленного в файле. Исключение составляет фильтр только из соединенных через AND проверок IS NOT NULL на столбцах ключа — фильтр, который нужен SQL Server, чтобы уникальный столбец мог содержать больше одного NULL: такой ключ остается уникальным.
Уникальный ключ, указывающий столбец, которого нет в таблице, например столбец, добавленный через ALTER TABLE ... ADD COLUMN, отбрасывается целиком, а не сокращается до существующих столбцов. Обычный индекс сохраняет существующие столбцы.

Oracle SQL Developer и DBMS_METADATA записывают собственный индекс ключа отдельным оператором CREATE UNIQUE INDEX с именем ключа или, для безымянного ключа, за которым следует USING INDEX, с системным именем, например SYS_C0012345. Импорт читает такой индекс, а также индекс, указанный в ADD CONSTRAINT ... USING INDEX, как часть его ключа: составной уникальный ключ импортируется как один уникальный индекс, а первичный ключ или уникальный ключ на один столбец — как флаги столбцов без дополнительного индекса. Затем экспорт обратно в Oracle создает индекс один раз.

Для MySQL, MariaDB, MSSQL, Oracle, PostgreSQL и SQLite экспорт Схемы SQL импортируется обратно с теми же флагами «Уникальный» и индексами.
В Snowflake нет вторичных индексов, поэтому его экспорт возвращает только уникальные ключи: составной — как уникальный индекс, а ключ на один столбец — как флаг «Уникальный» этого столбца. Экспорт для Databricks не объявляет уникальность, поэтому она не возвращается.

Внешние ключи​

Внешний ключ становится связью при следующих вариантах записи:

  • Запись FOREIGN KEY (...) REFERENCES t (...) на уровне таблицы, с CONSTRAINT name или без него.
  • Оператор ALTER TABLE ... ADD [CONSTRAINT name] FOREIGN KEY (...) REFERENCES t (...), в том числе ALTER TABLE t WITH CHECK ADD ... и WITH NOCHECK ADD ..., которые записывает SQL Server Management Studio.
  • Встроенная в определение столбца запись REFERENCES t (col), как в user_id INT REFERENCES users (id), а также запись FOREIGN KEY REFERENCES t (col), которую в этом месте допускают SQL Server и Snowflake. Встроенная ссылка более чем на один столбец пропускается.

Оператор ALTER TABLE дает не больше одной связи, и только если его первое предложение добавляет внешний ключ: предложение FOREIGN KEY после предложения ADD PRIMARY KEY или ADD UNIQUE в том же операторе не читается. Если один оператор добавляет несколько внешних ключей, как в записи phpMyAdmin ADD CONSTRAINT fk1 FOREIGN KEY ..., ADD CONSTRAINT fk2 FOREIGN KEY ..., читается только последний.

Запись REFERENCES t без списка столбцов указывает на первичный ключ таблицы t, если этот ключ состоит из одного столбца. При составном первичном ключе внешний ключ пропускается.
Внешний ключ пропускается, и ни один из его столбцов не помечается как внешний ключ, если не найден ни один из его целевых столбцов или если число найденных столбцов в двух таблицах различается, например когда столбец отсутствует только в одной из них. Если в обеих таблицах недостает одинакового числа его столбцов, найденные столбцы сопоставляются попарно в порядке записи, и связь включает только их.
Каждая импортированная связь имеет тип Zero N и является идентифицирующей, если каждый из ее дочерних столбцов также является первичным ключом.

Предложения ON DELETE и ON UPDATE каждого внешнего ключа становятся параметрами On Delete и On Update связи: NO ACTION, RESTRICT, CASCADE, SET NULL или SET DEFAULT, в любом регистре и в любом порядке. Внешний ключ без них импортируется как Not set. О том, как задать их в редакторе, см. Редактирование связей.
Список столбцов в PostgreSQL после SET NULL или SET DEFAULT, как в ON DELETE SET NULL (a_id), пропускается при чтении: действие применяется ко всему ключу, а ON UPDATE после списка по-прежнему читается. Предложения MATCH FULL, MATCH PARTIAL и MATCH SIMPLE пропускаются, а атрибут столбца ON UPDATE CURRENT_TIMESTAMP из MySQL не принимается за действие.
Экспорт Схемы SQL импортируется обратно с теми действиями, которые записывает эта база данных, поэтому действие, которое она пропускает, например SET DEFAULT в MySQL, любое ON UPDATE в Oracle или все, кроме NO ACTION, в Snowflake, возвращается как Not set.

Комментарии​

Комментарии таблиц и столбцов импортируются из трех вариантов синтаксиса, которые читает парсер: параметр таблицы и атрибут столбца COMMENT, используемые в MySQL, MariaDB, Snowflake и Databricks, операторы COMMENT ON TABLE и COMMENT ON COLUMN, используемые в PostgreSQL и Oracle, и расширенное свойство MS_Description, которое SQL Server задает через EXEC sp_addextendedproperty.
Комментарий к таблице или столбцу, которые не определены в файле, игнорируется.

Вызовы SQL Server читаются и с именованными аргументами, как SQL Server Management Studio записывает каждый комментарий (@name=N'MS_Description', @value=N'...', ..., @level1type=N'TABLE', @level1name=N'Users'), и с позиционными, как их записывает экспорт MSSQL в редакторе.
Комментарий дает только свойство MS_Description таблицы или одного из ее столбцов на уровне 2. Другое свойство, представление, индекс или ограничение комментария не дает, как и комментарий, переданный в переменной или составленный с помощью +.

В комментарии, как и в любом тексте в кавычках, например в значении DEFAULT или имени в кавычках, удвоенная кавычка означает одну кавычку, как ее записывают mysqldump и pg_dump: 'it''s' читается как it's.
Обратная косая черта перед кавычкой, как в записи 'it\'s' в MySQL и MariaDB, тоже экранирует кавычку. Такая кавычка все равно завершает текст, если за ней следует пробельный символ, ,, ;, ), ], :, |, + или конец файла, поэтому 'C:\', 'C:\'::text из pg_dump и 'C:\'+name из T-SQL сохраняют свою обратную косую черту.
Значение DEFAULT сохраняет свои кавычки, а кавычка внутри него записывается удвоенной, как бы она ни была экранирована в файле: 'it''s'.
Если в момент импорта база данных документа — Databricks, текст в одинарных кавычках вместо этого следует правилам Spark: каждая обратная косая черта экранирует следующий за ней символ, поэтому 'C:\\dir' читается как C:\dir, управляющие последовательности, например \n, \t и \u0041, декодируются, а значение DEFAULT сохраняется как 'it\'s'.

Экспортированная Схема SQL экранирует кавычку внутри комментария таблицы или столбца: COMMENT 'it''s' для MySQL, MariaDB и Snowflake, COMMENT ON TABLE и COMMENT ON COLUMN ... IS 'it''s' для PostgreSQL и Oracle и такое же удвоение, включая имена таблиц и столбцов, в вызовах sp_addextendedproperty для MSSQL. Комментарий без кавычек записывается как есть.
Databricks вместо этого экранирует кавычку и обратную косую черту обратной косой чертой, как в COMMENT 'it\'s', поэтому его экспорт читается обратно точно, только пока Databricks выбран в качестве базы данных.
MSSQL записывает каждый комментарий как EXECUTE sys.sp_addextendedproperty 'MS_Description', '<comment>', 'schema', '<schema>', 'table', '<table>', а для столбца после этого добавляется 'column', '<column>'. Когда параметр Bracket имеет значение None, таблица с именем sales.users дает схему sales и таблицу users, а имя без схемы относится к dbo. При любом другом значении Bracket все имя целиком считается именем таблицы в схеме dbo.

Комментарии не сохраняются при экспорте в SQLite и обратном импорте: SQLite записывает их как обычные строки --, которые парсер не читает. Вызовы sp_addextendedproperty из экспорта MSSQL импортируются обратно как те же комментарии таблиц и столбцов.

GraphQL​

Можно импортировать документ GraphQL SDL.
Определения объектных типов становятся таблицами, блок extend type объединяется с расширяемым им типом, а поля интерфейсов наследуются типами, которые их реализуют.
Поле, типом которого является другая таблица, становится связью, а не столбцом, а список на обеих сторонах создает связующую таблицу.
Поле, не являющееся списком, например buyer: User, сначала сопоставляется с тем единственным полем другого типа, имя которого оканчивается на By с последующим именем этого поля, например orderListByBuyer, без учета регистра и подчеркиваний; поле с номером, например buyer2, сопоставляется так же, но без номера. Именно так GraphQL-вывод Генератора кода именует поля, когда у двух таблиц больше одной общей связи или таблица ссылается на саму себя, поэтому такой вывод импортируется обратно со всеми связями.
Корневые типы (Query, Mutation, Subscription), типы интроспекции и обертки Relay, федерации и Hasura, например PageInfo, *Connection, *Edge и *_aggregate, считаются шумом и пропускаются.
Директивы @id, @primaryKey, @unique, @autoincrement, @default, @map, @relation, @column, @table, @index и @db.* учитываются.
Имя файла должно оканчиваться на .graphql, .gql или .graphqls. Файл Prisma schema.prisma не является документом GraphQL, и импортировать его здесь нельзя.

DBML​

Можно импортировать файл в формате DBML, который используют dbdiagram.io и dbdocs.
Читаются блоки Table, TablePartial, Ref, Enum и TableGroup. Блоки Project и отдельные блоки Note пропускаются, не влияя на окружающие их таблицы.
Принимаются все варианты записи ссылок: форма Ref: с двоеточием, именованная ссылка, блочная форма Ref { } и встроенная настройка столбца [ref: > table.column].
Ссылка многие-ко-многим <> создает связующую таблицу, имя которой образовано от имен обеих сторон.
Настройки delete и update отдельной ссылки становятся параметрами On Delete и On Update связи, как в Ref: users.id < posts.user_id [delete: cascade, update: set null]. Допустимые значения: cascade, restrict, set null, set default и no action, в любом регистре. Любое другое значение или отсутствие настройки импортируется как Not set, а другие настройки, например color, игнорируются.
Встроенная настройка [ref: ...] не переносит действия, а настройки ссылки <> не переносятся на связующую таблицу. Если один и тот же внешний ключ объявлен и во встроенной форме, и отдельной ссылкой, сохраняется встроенный вариант, без действий.
Настройка таблицы headercolor, как в Table users [headercolor: #3498DB], становится ее цветом, если значение — шестнадцатеричный цвет #rgb или #rrggbb, записанный без кавычек. Любое другое значение отбрасывается, а headercolor блока TablePartial не передается таблицам, которые его используют.
Каждый блок TableGroup становится группой таблиц, содержащей перечисленные в нем таблицы — по одной на строку, с именами, записанными так же, как в Ref. Его настройка [color: ...] становится цветом группы по тому же правилу, что и headercolor, а его примечание и другие настройки отбрасываются. Таблица, перечисленная в двух группах, остается в первой. Группа, в которой не осталось таблиц, не создается — независимо от того, нет ли в ее списке ни одной таблицы, объявленной в файле, или в нем есть только таблицы, уже занятые предыдущей группой. Рамка группы подгоняется под ее таблицы, где бы они ни были размещены, а когда таблицы выстраиваются рядами, таблицы одной группы остаются вместе.
Имя файла должно оканчиваться на .dbml.

AML​

Можно импортировать файл AML (Azimutt Markup Language). Принимаются как текущий вариант записи, так и устаревший вариант v1.
Сущности становятся таблицами, а вложенные атрибуты разворачиваются в имя столбца через точку, например settings.slug.
Атрибуты импортируются как NOT NULL, если не помечены как nullable, а конструкции, для которых в редакторе нет места, например check, type и tags, отбрасываются, а не отклоняются. Сущность, помеченная как представление, импортируется как обычная таблица.
Свойство color сущности, как в users {color: red}, становится цветом ее таблицы. Имена цветов AML — red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink, rose и gray — читаются в любом регистре, в кавычках или без, каждое как оттенок 500 цвета Tailwind с тем же именем, например #ef4444 для red. Шестнадцатеричное значение в кавычках, например "#3498db", сохраняется как записано; #3498db без кавычек прочитать нельзя, потому что # начинает комментарий AML. Любое другое значение, а также color у атрибута или связи отбрасываются.
Отдельный оператор rel или fk в устаревшей записи сохраняет свои свойства onDelete и onUpdate как параметры On Delete и On Update связи, как в rel posts(user_id) -> users(id) {onDelete: cascade, onUpdate: "set null"}. Допустимые значения: cascade, restrict, set null, set default и no action, в кавычках или без, в любом регистре. Другие свойства отбрасываются.
У встроенной связи, например user_id int -> users(id) {onDelete: cascade}, свойства относятся к атрибуту, поэтому они отбрасываются, а связь импортируется как Not set.
Имя файла должно оканчиваться на .aml.

GraphQL, DBML и AML поддерживают обмен в обе стороны: каждый из них также является целевым форматом Генератора кода.
DBML и AML переносят ON DELETE и ON UPDATE каждой связи в обе стороны — см. Генератор кода. GraphQL не переносит ни то ни другое, поэтому при импорте GraphQL оба параметра остаются Not set.
DBML также переносит в обе стороны цвета таблиц, без прозрачности, и каждую группу таблиц, в которой есть таблица. Группа без имени возвращается как group_1, group_2 и т. д., а повторяющееся имя группы возвращается с добавлением _2, _3 и т. д. AML переносит цвет таблицы только как ближайшее из своих имен цветов, поэтому #FF8800 записывается как orange и возвращается как #f97316, а группы AML не переносит. GraphQL не переносит ни цвета, ни группы.

Экспорт​

В подменю Export контекстного меню холста три пункта:

  • json: Сохраняет диаграмму в том виде, в каком ее хранит файл, как .erd.json: таблицы с их столбцами и индексами, связи, заметки и группы таблиц, а также настройки, причем каждая заблокированная настройка сохраняется с заблокированным значением.
  • Schema SQL: Открывает вкладку «Схема SQL» с открытой панелью параметров и фокусом на кнопке Save file, поэтому при нажатии Enter SQL, показанный на вкладке, сохраняется как .sql. До этого ничего не сохраняется.
  • Image: Открывает окно Export image, которое сохраняет диаграмму как .png или .svg либо копирует ее в буфер обмена в формате PNG, — см. Изображение.

Все три пункта работают в редакторе только для чтения.

Схема SQL записывает ON DELETE и ON UPDATE каждой связи после ее предложения REFERENCES, сначала ON DELETE. Значение Not set ничего не записывает, а действие, которое выбранная база данных не принимает, пропускается. О том, какая база данных какие действия принимает, см. Редактирование связей.

Каждый экспортированный файл получает имя <database name>-<timestamp> с последующим расширением, где отметка времени указывается по местному времени в формате yyyy-MM-dd'T'HH_mm_ss — например my-schema-2026-08-29T04_05_06.erd.json. Если имя базы данных пустое, используется unnamed.
Кнопки Save file на вкладке «Схема SQL» и в Генераторе кода называют файлы так же. Изображение получает имя базы данных, каким оно было в момент открытия окна.

Команды Import, Import and Add и Export также доступны в Быстром поиске на вкладке ERD с теми же пунктами, что и в контекстном меню холста.

В Obsidian окно загрузки или сохранения не появляется: файл записывается в хранилище, туда, куда Obsidian помещает новые вложения для этой диаграммы, а уведомление сообщает его путь.
Символы, которые Obsidian не допускает в имени файла, \ / : * ? " < > |, заменяются на -.
Проводник файлов Obsidian показывает экспортированный файл .erd.json или .sql, только пока включен параметр Settings → Files and links → Detect all file extensions.

Изображение​

Пункт Export ▸ Image в контекстном меню холста или в Быстром поиске открывает окно Export image: предварительный просмотр изображения рядом с его параметрами. Открытый Обозреватель остается открытым под затемненной областью.

Открытие Export &gt; Image, выключение темного режима и фона, выбор 3x и копирование изображения в буфер обмена

  • Background: Включено по умолчанию. Если выключить, холст остается прозрачным.
  • Dark mode: Изначально соответствует оформлению редактора. Пока значение соответствует оформлению на экране, изображение использует собственные цвета холста, включая изменения из конструктора темы; при другом оформлении используется предустановленная тема с тем же оттенком серого и цветом акцента.
  • Scale: 1x, 2x или 3x, по умолчанию выбрано 2x. Определяет размер только PNG и копии в буфере обмена, а строка под ним показывает этот размер в виде PNG <width> × <height> px.

Выбранные значения действуют до закрытия редактора и никогда не сохраняются в документе. Предварительный просмотр отрисовывается так же, как изображение, и перерисовывается при изменении параметра Background или Dark mode.

Изображение содержит диаграмму в том состоянии, в каком она была при открытии окна; чтобы учесть более поздние изменения, закройте и снова откройте окно. Оно содержит всю диаграмму, как бы далеко она ни была прокручена, обрезанную по границам ее содержимого с отступом, и всегда отрисовывается в масштабе 100%, какой бы масштаб ни показывал редактор, поэтому каждая таблица отрисовывается полностью. Скрытое в Параметрах вида — связи, их метки ON DELETE и ON UPDATE, группы таблиц или заметки — не отрисовывается и не занимает места, а группы таблиц отрисовываются позади всего остального.

Изображение записывают три кнопки, и каждая из них оставляет окно открытым:

  • PNG: Сохраняет .png размером с диаграмму в масштабе 100%, умноженным на значение Scale. PNG, слишком большой для холста браузера, не вызывает ошибку, а записывается с пониженным разрешением: окно заранее предупреждает сообщением Reduced from <width> × <height> px, past what a browser canvas can hold, а после сохранения об этом сообщает уведомление Exported at a reduced resolution.
  • SVG: Сохраняет .svg размером с диаграмму в масштабе 100% при любом значении Scale, и его размер никогда не уменьшается. Текст в нем остается текстом, а шрифты указываются по имени, а не встраиваются, поэтому программа просмотра без шрифта редактора отображает текст другим шрифтом. Тени не включаются.
  • Copy to clipboard: Помещает PNG в буфер обмена с выбранным значением Scale, понижая разрешение так же, как у сохраняемого PNG, если холст браузера не может его вместить. Подтверждает копирование сообщением Copied the image to the clipboard или, если разрешение изображения было понижено, сообщением Copied at a reduced resolution. Если копирование не удалось, потому что браузер или хост запрещает доступ к буферу обмена или изображение не удалось отрисовать, сообщение Couldn't copy the image предлагает вместо этого сохранить PNG.

Изображение отрисовывается в фоновом воркере, если хост его запускает, поэтому в это время редактором можно пользоваться. Если отрисовка занимает больше мгновения, отображается уведомление Exporting PNG, Exporting SVG или Copying image, а о сбое сообщает уведомление Couldn't export the PNG или Couldn't export the SVG. Если закрыть окно, пока файл еще отрисовывается, сохранение этого файла не прервется.

При открытии окна фокус находится на кнопке PNG, а клавиша Tab не выводит фокус за пределы окна. Клавиша Escape, кнопка x или щелчок по затемненной области вокруг окна закрывает его.
Пока окно открыто, сочетания клавиш холста, включая отмену и повтор, а также копирование и вставка ничего не делают. Ctrl + K (Windows/Linux) или ⌘ + K (Mac) закрывает окно и открывает Быстрый поиск. Ctrl + F (Windows/Linux) или ⌘ + F (Mac) закрывает окно и помещает курсор ввода в поле поиска Обозревателя, открывая Обозреватель, если он закрыт, но никогда не закрывая его. В редакторе, слишком узком для отображения Обозревателя, это сочетание все равно закрывает окно, но вместо перемещения курсора ввода показывает уведомление.