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

Инструменты

Сервер предоставляет 77 инструментов: пять инструментов сеанса, четыре инструмента чтения, 67 инструментов редактирования, по одному на каждую операцию редактирования, и инструмент erd_batch, который выполняет несколько инструментов редактирования как одну правку.

Каждый инструмент, кроме erd_list_documents, принимает первым аргументом путь к документу path, и в таблицах ниже этот аргумент опущен. Аргумент, помеченный знаком ?, необязателен.

Инструменты сеанса​

ИнструментАргументыЧто делает
erd_list_documentsВыводит список ERD-документов с полями path, open, active, dirty и readonly: документы редактора, который обслуживает рабочий каталог, причем в IDE JetBrains это документы всех открытых проектов, а иначе — ERD-файлы в рабочем каталоге.
erd_open_documentcreate?Открывает документ для редактирования — в ERD Editor того редактора, который его обслуживает, если такой редактор есть. С аргументом create сначала создает файл, если его нет, а к имени без расширения добавляется .erd.json.
erd_saveСохраняет документ, который находится в редакторе. VS Code оставляет правки агента несохраненными, пока не будет вызван этот инструмент; Obsidian и IDE JetBrains сохраняют их так же, как ваши, а этот инструмент записывает их сразу. В режиме Headless каждая правка уже записана, о чем сообщает значение saved: true в ее результате, и инструмент ничего не делает.
erd_undoОтменяет последнюю правку, сделанную этим агентом, но никогда не ваши. Вызовы, не создавшие шага отмены, пропускаются, и инструмент их называет.
erd_redoПовторно применяет правку, которую последней отменил erd_undo.

О том, что делают сохранение и отмена в каждом режиме, см. Режимы Live и Headless.

Чтение документа​

ИнструментАргументыЧто делает
erd_listquery?, offset?, limit?, namesOnly?Настройки и счетчики, затем страница таблиц с их индексами и связями, причем для каждой таблицы указаны ее идентификатор, положение и размер на холсте, число столбцов, логическое имя, если оно есть, и группа таблиц, если таблица в нее входит. Если не выполняется поиск, после таблиц идут группы таблиц, заметки, а затем домены, термины и слова.
erd_gettableIds?, tableNames?, relationshipIds?, indexIds?, memoIds?, tableGroupIds?, wordIds?, termIds?, domainIds?Указанные сущности целиком: таблицы с их столбцами и группой таблиц, связи с их столбцами и значениями onDelete и onUpdate, индексы с их столбцами, заметки с их текстом, группы таблиц с их таблицами, а также слова, термины и домены со всеми их полями.
erd_readformat, vendor?, statements?, header?, logicalNameAsComment?, tableIds?, tableNames?, groupNames?Весь документ сразу в одном из четырех форматов либо DDL только некоторых таблиц или групп таблиц.
erd_list_checkslevel?, tableIds?, tableNames?, offset?, limit?То, что словари слов, терминов и доменов находят ошибочным, в том виде, в каком это перечисляет лист Checks вкладки «Словарь» редактора, постранично. Ничего не изменяет — см. Проверки словарей.

Агент находит идентификаторы с помощью erd_list, читает столбцы, строки словарей и другие сведения с помощью erd_get и передает эти идентификаторы инструментам редактирования. Размер таблицы в выводе erd_list — это прямоугольник, который она занимает на холсте: высота точная, ширина приблизительная. Для группы таблиц выводятся хранимый ею прямоугольник, ее имя, цвет и число таблиц в ней. Каждая связь выводится один раз — вместе с одной из двух ее таблиц. Строка словаря выводится со своим идентификатором, полем name и тем, что она дает физическому имени или столбцу: полем dataType домена, полями physicalName и domainId термина и полем abbreviation слова. Каждый словарь выводит свои строки в том порядке, в котором их показывает его лист. Инструменты erd_list и erd_read сообщают те настройки, которые сохраняет файл, — см. Настройки.

В выводе erd_get и формата snapshot инструмента erd_read каждая таблица и каждый столбец содержат поле logicalName, равное пустой строке, если логического имени нет, и поле nameDerived, которое равно true, пока имя дано словарями, так что новое логическое имя формирует его заново, — см. Словари. Каждый столбец содержит поле domainId, и каждый термин тоже: это пустая строка, если домена нет или если документ больше не содержит этот домен.

Инструмент erd_read принимает один из четырех форматов:

formatЧто возвращает
snapshotКомпактный JSON со всеми сущностями и их идентификаторами, включая группы таблиц и строки слов, терминов и доменов, а также с настройками вместе со скриптами Схемы SQL. В него не входит то, что различается у разных пользователей: измеренные значения ширины, порядок наложения, вид, вкладка и режим отображения имен. Для большой схемы он получается объемным.
sqlDDL для одной из восьми баз данных: Databricks, MariaDB, MSSQL, MySQL, Oracle, PostgreSQL, Snowflake или SQLite. По умолчанию vendor — это база данных, заданная в документе. DDL всего документа включает его скрипты перед таблицами и после них. С аргументами tableIds, tableNames или groupNames — только эти таблицы с их внешними ключами и без скриптов. Внешние ключи содержат свои действия ON DELETE и ON UPDATE, кроме тех, которые целевая база данных опускает, — см. ON DELETE и ON UPDATE.
jsonВесь документ точно в том виде, в каком сохранение записывает его в файл, включая правки, которые редактор еще не сохранил, — см. Форма хранения.
scriptsТолько скрипты документа перед таблицами и после них в виде {"before":"…","after":"…"}, где незаданный скрипт пуст, — какой бы большой ни была схема.

Аргументы vendor, statements, header, logicalNameAsComment, tableIds, tableNames и groupNames принимает только формат sql, а любой другой формат их отклоняет.

  • statements: create — значение по умолчанию; ifNotExists, при котором для MySQL, MariaDB, PostgreSQL, SQLite и Databricks выдается CREATE TABLE IF NOT EXISTS, а для остальных — обычный CREATE TABLE; или recreate, при котором таблицы удаляются перед созданием, причем для Snowflake вместо этого выдается CREATE OR REPLACE TABLE.
  • header: none — значение по умолчанию; use, при котором выбирается база данных или схема, заданная именем базы данных документа; или createAndUse, при котором она сначала создается. В Oracle есть только use, поэтому createAndUse выдает там use, а в PostgreSQL есть только createAndUse, поэтому use не выдает там заголовка. Для SQLite заголовок не выдается, и ни для одной базы данных он не выдается, пока имя базы данных пустое или не является простым идентификатором.
  • logicalNameAsComment: true записывает логическое имя таблицы или столбца в качестве комментария, пока комментарий пуст или состоит из одних пробелов, — там, где каждая база данных пишет комментарии, и в той форме, в которой она их пишет, — и сохраняет каждый комментарий с текстом; false, значение по умолчанию, не записывает логических имен — см. Логические имена в комментариях.
  • groupNames: таблицы указанных групп таблиц — по имени без учета регистра, вместе с таблицами из tableIds и tableNames. Имя, не совпадающее ни с одной группой, отклоняется с кодом notFound. Группа без таблиц не добавляет ни одной таблицы, а чтение, в котором не осталось ни одной таблицы, как в случае, когда все указанные группы пусты и ни одна таблица не указана, отклоняется с кодом invalidArgs.

Аргументы statements, header и logicalNameAsComment применяются и к DDL отдельных таблиц. Они работают так же, как параметры Statements и Header и переключатель Write logical names into empty comments на вкладке «Схема SQL» редактора, хотя на вкладке изначально выбраны If not exists и CREATE + USE. Переключатель изначально выключен, как и аргумент logicalNameAsComment по умолчанию. Имена заключаются в кавычки того типа, который сохраняет файл (пока параметр Bracket Type заблокирован, это заблокированный тип), — см. Блокировка.

Большие схемы​

Схемы из сотен или тысяч таблиц тоже поддерживаются. Одно чтение возвращает не более 40 000 символов, что ниже порога, начиная с которого Claude Code откладывает результат инструмента в отдельный файл.

  • erd_list по умолчанию возвращает страницу из 100 элементов: сначала таблицы, затем группы таблиц, заметки, домены, термины и слова, причем через них всех проходит одно общее смещение, а в полях nextOffset и note сообщает, где начинается следующая страница. Передайте это значение nextOffset как offset с тем же значением query.
  • query ищет таблицы по словам в имени, логическом имени или комментарии таблицы либо столбца без учета регистра. Таблицы, в именах или логических именах которых больше этих слов, идут первыми. При поиске группы таблиц, заметки и строки словарей не выводятся.
  • namesOnly выводит только имена таблиц — около 2000 коротких имен в одном ответе.
  • erd_get и erd_read принимают не только идентификаторы, но и tableNames, а erd_read — еще и groupNames, поэтому агент, которого попросили написать SQL-запрос к большой схеме, читает DDL только нужных ему таблиц.
  • Словари тоже выдаются частями: erd_list постранично выводит их строки после таблиц, а erd_get выдает строки целиком по domainIds, termIds и wordIds.
  • erd_get перечисляет в поле missing идентификаторы и имена, которым ничего не соответствует, а в поле notReturned — идентификаторы, не поместившиеся в один ответ, чтобы их можно было запросить снова.
  • erd_list_checks так же отвечает постранично — см. Проверки словарей.
  • Чтение, слишком большое для одного ответа, отклоняется с кодом tooLarge и подсказкой, как его сузить.

Проверки словарей​

erd_list_checks перечисляет проверки листа «Проверки» редактора в том же порядке: сначала проверки слов, затем проверки терминов и доменов, каждый словарь — в том порядке, в котором его показывает лист, затем каждая таблица, а за ней ее столбцы. Как и на листе, проверка выполняется, только пока словарь, который она читает, содержит хотя бы одну строку. Документ, словари которого не содержат ни одного слова, термина или домена, не проверяется вовсе: поле total равно 0, и об этом сообщает поле note.

  • level: error или warning — только для этого уровня; по умолчанию оба.
  • tableIds и tableNames: только проверки этих таблиц и их столбцов, с именами без учета регистра, что исключает собственные строки словарей. Идентификатор или имя, которым не соответствует ни одна таблица, отклоняется с кодом notFound.
  • offset и limit: по умолчанию страница из 100 проверок, которая также заканчивается там, где заполняется один ответ. Пока есть следующие проверки, поля nextOffset и note сообщают, где начинается следующая страница; передайте это значение как offset с теми же фильтрами. Исправив часть проверок, снова выведите список со смещения 0: исправленная проверка исчезает из списка, поэтому более позднее смещение пропустило бы еще не исправленные проверки.

Ответ содержит поле total — сколько проверок оставляют фильтры; поле counts — сколько из них приходится на каждый код, без кодов, на которые не приходится ни одной; и саму страницу в поле checks. Каждая проверка указывает свои поля level и code, а также поля kind и id своего объекта: table, column, word, term или domain. Проверка столбца добавляет поле tableId и имя его таблицы в поле table. Поле name — имя объекта, т. е. физическое имя таблицы или столбца, вместе с полем logicalName, если логическое имя есть. Поле field — то, что читает проверка: name, logicalName или domainId. Поле text — то, что она там нашла, а поле suggestions, если словари что-то предлагают, — то, что использовать вместо этого. Поэтому агент может исправить проверку без вызова erd_get:

{"level":"warning","code":"physicalNameMismatch","kind":"column","id":"8e1z0q4xk2m7cwd5tfb9h3ynp","tableId":"03h17be2plxpj5n59tqag7ogj","table":"users","name":"id","logicalName":"Member Number","field":"name","text":"id","suggestions":["MBR_NO"]}
codelevelType на листеЧто находит
duplicateNameerrorDuplicate nameИмя, общее для двух строк одного словаря. Выводится каждая из этих строк.
unknownDomainerrorUnknown domainСтолбец или термин, привязанный к домену, которого больше нет в документе. Поле text — имя этого домена или его идентификатор, если имя неизвестно.
forbiddenWorderrorForbidden wordСлово, которое какое-либо слово указывает как запрещенное, в логическом имени таблицы или столбца либо в имени термина. Поле suggestions содержит стандартные слова.
unregisteredWordwarningUnregistered wordТекст, который не указан ни в одном слове, в тех же местах.
synonymWordwarningSynonymСиноним, использованный вместо стандартного слова, в тех же местах. Поле suggestions содержит стандартные слова.
physicalNameMismatchwarningPhysical name mismatchФизическое имя таблицы или столбца, отличное от того, которое дает термин его логического имени. Предлагается физическое имя термина или, если у термина его нет, имя, которое составляют его слова.
domainTypeMismatchwarningDomain type mismatchСтолбец, тип данных которого не совпадает с типом домена, к которому он привязан. Поле text — тип столбца, а предлагается тип домена.

Как каждая проверка читает имя, описано в разделе Что находит каждая проверка.

Инструменты редактирования​

Идентификаторы берутся из erd_list и erd_get или из поля createdIds вызова, создавшего сущность. Новый идентификатор состоит из 25 строчных букв и цифр, например 03h17be2plxpj5n59tqag7ogj, а идентификатор, который уже есть в документе, сохраняет свою форму, поэтому не делайте никаких выводов по виду идентификатора. x и y — левый и верхний края на холсте в пикселях, а цвет — это шестнадцатеричный цвет CSS, например #3b82f6, или пустая строка, которая убирает цвет.

Таблицы​

ИнструментАргументыЧто делает
erd_add_tableДобавляет пустую таблицу на свободное место и возвращает ее идентификатор в createdIds.
erd_remove_tabletableIdУдаляет таблицу вместе с ее столбцами, индексами и всеми связями, в которых она участвует.
erd_change_table_nametableId, valueПереименовывает таблицу. После этого имя считается написанным вручную, поэтому последующее логическое имя оставляет его как есть, пока оно не пустое, — см. Словари.
erd_change_table_commenttableId, valueЗадает комментарий таблицы. Пустая строка очищает его.
erd_set_table_logical_nametableId, valueЗадает логическое имя таблицы. Пустая строка очищает его и оставляет имя. Пока имя таблицы пустое или было сформировано, словари формируют его из логического имени — см. Словари. Термин не дает таблице домена.
erd_change_table_colortableId, colorЗадает цвет таблицы.
erd_move_tabletableId, x, yПеремещает таблицу в указанное положение на холсте.
erd_move_tablespositionsПеремещает несколько таблиц одной правкой, которую отменяет один вызов erd_undo. positions содержит { tableId, x, y } для каждой таблицы, причем каждая таблица указывается не более одного раза.
erd_sort_tablesРасставляет все таблицы рядами по холсту, начиная с таблиц с наименьшим числом столбцов, так же как их расставляют erd_import_sql, erd_import_graphql, erd_import_dbml и erd_import_aml. Таблицы одной группы остаются вместе, а рамка каждой группы подгоняется по ним.

Столбцы​

ИнструментАргументыЧто делает
erd_add_columntableIdДобавляет в таблицу пустой столбец и возвращает его идентификатор в createdIds.
erd_remove_columnstableId, columnIdsУдаляет столбцы из одной таблицы вместе со связями и записями индексов, которые их используют.
erd_change_column_nametableId, columnId, valueПереименовывает столбец. После этого имя считается написанным вручную, как и у таблицы.
erd_change_column_data_typetableId, columnId, valueЗадает тип данных, например INT или VARCHAR(255). Пока включена Синхронизация типа данных в связях, изменение распространяется по связям в обе стороны, как и в редакторе: тип serial передается внешним ключам как целочисленный тип, который он хранит, так же как его копирует erd_add_relationship, а ключ типа serial сохраняет свой тип, когда меняется один из его внешних ключей, и на этом изменение останавливается. Синхронизацию включает и выключает пользователь, а erd_list сообщает ее состояние в поле relationshipDataTypeSync. Столбец, привязанный к домену, отвязывается от него, когда ему задается тип, отличный от типа домена, как и каждый столбец, до которого доходит синхронизация и чей новый тип отличается от типа его собственного домена, — см. Снятие привязки.
erd_change_column_defaulttableId, columnId, valueЗадает значение по умолчанию в виде текста SQL. Пустая строка очищает его.
erd_change_column_commenttableId, columnId, valueЗадает комментарий. Пустая строка очищает его.
erd_set_column_logical_nametableId, columnId, valueЗадает логическое имя столбца. Пустая строка очищает его и оставляет имя. Пока имя столбца пустое или было сформировано, словари формируют его, а столбец привязывается к домену термина и получает тип данных этого домена — см. Словари.
erd_set_column_domaintableId, columnId, domainId?, domainName?Привязывает столбец к домену, заданному по идентификатору или по имени — одним из двух способов. Столбец получает тип данных домена, который распространяется по связям, пока включена Синхронизация типа данных в связях, с тем же снятием привязки, что и у erd_change_column_data_type. Значение domainId, равное null или пустой строке, либо пустое значение domainName отвязывает столбец от домена и сохраняет его тип.
erd_set_column_primary_keytableId, columnId, valuetrue включает столбец в первичный ключ, false исключает его оттуда.
erd_set_column_uniquetableId, columnId, valueОпределяет, уникален ли столбец.
erd_set_column_not_nulltableId, columnId, valueОпределяет, является ли столбец NOT NULL.
erd_set_column_auto_incrementtableId, columnId, valueОпределяет, является ли столбец автоинкрементным.
erd_move_columntableId, columnId, targetColumnIdПеремещает столбец внутри его таблицы на место другого столбца.

Связи​

relationshipType — кардинальность на дочернем конце линии связи: ZeroOne, ZeroN, OneOnly или OneN. Начальная таблица — родительская, т. е. целевая сторона, которая содержит первичный ключ, а конечная таблица — дочерняя. onDelete и onUpdate — действия ON DELETE и ON UPDATE внешнего ключа: none, noAction, cascade, setNull, setDefault или restrict. Значение none не добавляет никакого предложения, поэтому действует поведение базы данных по умолчанию — см. ON DELETE и ON UPDATE. Действие, не указанное в вызове erd_add_relationship или erd_link_columns, равно none.

ИнструментАргументыЧто делает
erd_add_relationshipstartTableId, endTableId, relationshipType, onDelete?, onUpdate?Связывает две таблицы. Копирует первичный ключ родительской таблицы в дочернюю как столбцы внешнего ключа, а если у родительской таблицы его нет, сначала создает столбец первичного ключа. Каждый столбец внешнего ключа получает имя так же, как при рисовании связи в редакторе: ключ id таблицы users дает users_id, а такой ключ, как member_id, сохраняет свое имя — см. Имена столбцов внешнего ключа. Каждый из них копирует тип данных своего ключа, за исключением того, что ключ типа serial дает целочисленный тип, который он хранит, например integer для serial4, а простой serial остается serial во всех базах данных, кроме PostgreSQL, MySQL и MariaDB, — см. Идентифицирующие связи. Каждый из них также получает логическое имя своего ключа и привязывается к домену, к которому привязан ключ, если только ключ типа serial не дает ему другой тип. createdIds содержит новый столбец ключа, если он был создан, столбцы внешнего ключа и последним — идентификатор связи.
erd_link_columnsstartTableId, startColumnIds, endTableId, endColumnIds, relationshipType, onDelete?, onUpdate?Рисует связь между уже существующими столбцами, составляя пары из начальных и конечных столбцов по их позициям. Не переименовывает ни одного столбца, не меняет ни одного типа данных и не копирует ни логических имен, ни доменов.
erd_remove_relationshiprelationshipIdУдаляет линию связи. Ее столбцы внешнего ключа остаются в таблице.
erd_change_relationship_typerelationshipId, relationshipTypeМеняет кардинальность связи.
erd_change_relationship_on_deleterelationshipId, onDeleteЗадает действие ON DELETE связи: что происходит с дочерними строками при удалении родительской строки.
erd_change_relationship_on_updaterelationshipId, onUpdateЗадает действие ON UPDATE связи: что происходит с дочерними строками при изменении родительского ключа.

erd_add_relationship дает имена столбцам внешнего ключа и копирует логические имена их ключей в момент выполнения. Последующее переименование ключа или новое логическое имя ключа до них не доходит, поэтому сначала задайте имена родительской таблицы и ее первичного ключа, а также логическое имя ключа. Имена, которые он дает, считаются написанными вручную, поэтому последующее логическое имя оставляет их как есть, а erd_derive_physical_names возвращает их словарям — см. Словари.

Ни один инструмент не меняет столбцы существующей связи так, как это делает окно «Сопоставить столбцы» редактора. Чтобы сопоставить связь с другими столбцами, выполните erd_remove_relationship, который оставляет ее столбцы внешнего ключа в таблице, и erd_link_columns с нужными столбцами в одном вызове erd_batch, который отменяется одним вызовом erd_undo.

Индексы​

Идентификатор столбца индекса — это запись из списка столбцов индекса в ответе erd_get, а не идентификатор столбца таблицы.

ИнструментАргументыЧто делает
erd_add_indextableIdДобавляет в таблицу пустой индекс и возвращает его идентификатор в createdIds.
erd_remove_indexindexIdУдаляет индекс.
erd_change_index_nameindexId, valueПереименовывает индекс.
erd_set_index_uniqueindexId, valueОпределяет, уникален ли индекс.
erd_add_index_columnindexId, columnIdДобавляет в индекс столбец его таблицы и возвращает идентификатор нового столбца индекса. Столбец, который уже есть в индексе, остается без изменений.
erd_remove_index_columnindexId, indexColumnIdУдаляет один столбец из индекса.
erd_move_index_columnindexId, indexColumnId, targetIndexColumnIdПеремещает столбец внутри индекса на место другого его столбца.
erd_set_index_column_orderindexId, indexColumnId, orderTypeЗадает порядок сортировки одного столбца в индексе: ASC или DESC.

Заметки​

ИнструментАргументыЧто делает
erd_add_memoДобавляет пустую заметку на свободное место и возвращает ее идентификатор в createdIds.
erd_remove_memomemoIdУдаляет заметку.
erd_change_memo_valuememoId, valueЗаменяет текст заметки.
erd_change_memo_colormemoId, colorЗадает цвет заметки.
erd_move_memomemoId, x, yПеремещает заметку в указанное положение на холсте.
erd_resize_memomemoId, width, heightИзменяет размер заметки. Ширина должна быть не меньше примерно 116 пикселей, а высота — не меньше 100. Не создает шага отмены, так как редактор записывает изменение размера заметки только при перетаскивании.

Пока заметки скрыты через View Option → Memos, erd_add_memo все равно добавляет заметку, и она остается скрытой, пока заметки снова не будут показаны. erd_list и erd_get выводят и скрытые заметки.

Группы таблиц​

Группа таблиц — это именованная рамка, нарисованная позади ее таблиц, а ее цвет отображается на рамке и по всей ширине заголовков ее таблиц — см. Группы таблиц. Таблица входит не более чем в одну группу. erd_move_table, erd_move_tables и erd_move_table_group никогда не меняют состав группы, куда бы они ни поместили таблицу, тогда как в редакторе таблица входит в группу или выходит из нее в зависимости от того, где ее отпустили, — см. Добавление и исключение таблиц. erd_add_table_group и erd_set_table_group помещают таблицы в группу, а после erd_remove_table_group ее таблицы не входят ни в одну группу. Группа хранит прямоугольник шириной не менее 160 пикселей и высотой не менее 100 с учетом строки заголовка, а редактор рисует рамку, увеличенную так, чтобы вместить каждую из ее таблиц.

ИнструментАргументыЧто делает
erd_add_table_groupname, color?, x?, y?, width?, height?, tableIds?Добавляет группу и возвращает ее идентификатор в createdIds. Передайте либо tableIds, либо прямоугольник — x, y, width и height вместе. С аргументом tableIds каждая таблица покидает группу, в которой была, а прямоугольник подгоняется по таблицам так же, как при группировке выделенных таблиц. Прямоугольник захватывает каждую таблицу без группы, центр которой лежит внутри него, как и при рисовании группы. Пустое значение name оставляет группу без имени. Один вызов erd_undo удаляет группу и возвращает каждую таблицу в группу, в которой она была.
erd_remove_table_groupgroupIdУдаляет группу. Ее таблицы остаются на месте, не входя ни в одну группу.
erd_change_table_group_namegroupId, valueПереименовывает группу. Пустая строка оставляет ее без имени.
erd_change_table_group_colorgroupId, colorЗадает цвет группы.
erd_move_table_groupgroupId, x, yПеремещает группу так, чтобы ее прямоугольник начинался в этой точке, и сдвигает ее таблицы на то же расстояние, так же как при перетаскивании ее строки заголовка. Перемещение меньше чем на 20 пикселей по горизонтали и вертикали в сумме не создает шага отмены. Начиная с сервера версии 1.2.0 перемещение доходит до редактора как точки, в которых оказываются группа и ее таблицы, поэтому при расширении VS Code версии 4.3.0 или новее либо плагине Obsidian или JetBrains версии 1.3.0 или новее перемещение группы или одной из ее таблиц, сделанное там в один и тот же момент, заканчивается в одной из двух позиций, а не в их сумме — см. Правки, сделанные в один и тот же момент.
erd_resize_table_groupgroupId, x?, y?, width, heightЗадает прямоугольник группы, оставляя ее таблицы на месте. Если x и y не указаны, угол группы сохраняется. Прямоугольник, который не вместил бы таблицы группы с их отступами, отклоняется с сообщением, в котором указана область, которую он должен вмещать.
erd_set_table_grouptableIds, groupIdПомещает таблицы в группу, и каждая таблица покидает группу, в которой была. Значение groupId, равное null или пустой строке, исключает их из всех групп.

Пока группы скрыты через View Option → Table Groups, эти инструменты все равно добавляют и изменяют группы, которые остаются скрытыми, пока группы не будут показаны, — см. Скрытие групп. erd_sort_tables сохраняет таблицы каждой группы вместе, erd_import_dbml и erd_import_json переносят группы — см. Импорт, — а erd_read с аргументом groupNames выдает DDL выбранных групп. Версия ERD Editor, вышедшая до появления групп таблиц, при сохранении файла удаляет из него группы, как это делают расширение VS Code до версии 4.0.0 и плагины для Obsidian и JetBrains до версии 1.0.0, — см. Обновление.

Словари​

Эти инструменты редактируют три словаря вкладки «Словарь» редактора, по которым из логического имени таблицы или столбца формируется физическое имя:

  • Слово — это стандартное слово, из которых состоят логические имена, вместе с сокращением, которое оно записывает в физическое имя, например Member и MBR.
  • Термин — это логическое имя целиком вместе с физическим именем, которое он дает, и, для столбца, доменом, к которому он привязывает, например Member Number с MBR_NO и Identifier.
  • Домен — это именованный тип данных, к которому привязываются столбцы, например Identifier для INT.
ИнструментАргументыЧто делает
erd_add_wordname, abbreviation, englishName?, description?, synonyms?, forbiddenWords?Добавляет слово в конец словаря слов и возвращает его идентификатор в createdIds. synonyms и forbiddenWords перечисляются через запятую: другие написания слова и слова, которые нельзя использовать вместо него.
erd_update_wordwordId, name?, abbreviation?, englishName?, description?, synonyms?, forbiddenWords?Изменяет переданные поля и оставляет остальные.
erd_remove_wordwordIdУдаляет слово.
erd_add_termname, physicalName?, domainId?, domainName?, description?, synonyms?Добавляет термин в конец словаря терминов и возвращает его идентификатор в createdIds. Без аргумента physicalName физическое имя составляют слова, если это возможно, например MBR_NO для Member Number.
erd_update_termtermId, name?, physicalName?, domainId?, domainName?, description?, synonyms?Изменяет переданные поля и оставляет остальные. Аргумент name, переданный, пока у термина нет физического имени, или вместе с пустым physicalName, также записывает физическое имя, которое составляют его слова, если они его составляют.
erd_remove_termtermIdУдаляет термин.
erd_add_domainname, category?, dataType, description?Добавляет домен в конец словаря доменов и возвращает его идентификатор в createdIds. category группирует домены, например Number или Text.
erd_update_domaindomainId, name?, category?, dataType?, description?Изменяет переданные поля и оставляет остальные. Новый dataType доходит до каждого столбца, привязанного к домену, и распространяется по связям, пока включена Синхронизация типа данных в связях, с тем же снятием привязки, что и у erd_change_column_data_type.
erd_remove_domaindomainIdУдаляет домен. Привязанные к нему столбцы сохраняют свой тип данных, а у них и у привязанных к нему терминов домен не отображается: их domainId читается как пустая строка. erd_undo возвращает привязки, а при сохранении они не попадают в файл.
erd_derive_physical_namesscope, tableId?, columnId?Заново формирует физические имена из логических, как и повторное формирование физических имен в редакторе, — для одного столбца, одной таблицы или всего документа.
  • Словарь хранит каждое имя один раз, поэтому имя, которое уже есть в другой строке того же словаря, отклоняется с кодом invalidArgs. Имена сравниваются после удаления пробелов по краям и с учетом регистра букв, поэтому Member и member — это два разных имени.
  • Обновление указывает строку по ее идентификатору и передает хотя бы одно поле. Значения, которые уже есть в строке, ничего не меняют и не создают шага отмены; добавление или удаление всегда создает его.
  • Домен термина задается либо аргументом domainId, в котором отсутствие домена обозначают null или пустая строка, либо аргументом domainName, в котором его обозначает пустая строка. Аргумент domainName берет первый домен с этим именем в порядке словаря, причем имена сравниваются так же, как описано выше. Передача обоих аргументов или значения domainName, которого нет ни у одного домена, отклоняется. erd_set_column_domain принимает домен так же.
  • Изменение или удаление слова или термина ничего не переименовывает и ничего не отвязывает: имена и домены, которые они дали, остаются как есть. erd_derive_physical_names формирует имена заново и привязывает домен, который термин дает теперь, но столбец, которому теперь не соответствует ни один термин или термин которого не дает домена, сохраняет домен, к которому привязан. erd_set_column_domain с пустым domainId отвязывает его.
  • Ни один инструмент не импортирует и не экспортирует словарь в CSV, не сортирует словарь и не вставляет строки в определенное место, как это делает вкладка «Словарь».

erd_list выводит строки, erd_get выдает все поля, формат snapshot инструмента erd_read содержит их все, а erd_list_checks перечисляет то, что словари находят ошибочным, — см. Чтение документа.

erd_set_table_logical_name и erd_set_column_logical_name формируют физическое имя так же, как редактор при вводе логического имени, — см. Формирование физических имен:

  • Имя формируется, только пока оно пустое или само было сформировано, что чтения показывают как nameDerived: true. Непустое имя, написанное вручную, остается, и записывается только логическое имя. erd_change_table_name, erd_change_column_name, импорт SQL, GraphQL, DBML и AML, а также столбцы внешнего ключа, которым дает имена erd_add_relationship, — все они записывают имена вручную. Имя, переименованное в пустую строку, снова формируется следующим логическим именем.
  • Сначала берется термин, имя которого совпадает с логическим именем, причем сравнение выполняется так же, как для имен в словарях. Он дает свое физическое имя или, если у него его нет, то, которое составляют его слова. Для столбца он также привязывает домен термина, даже если имя не формируется, и столбец получает тип данных домена, который распространяется по связям, пока включена Синхронизация типа данных в связях.
  • Если такого термина нет, имя составляют слова, сокращения которых соединяются знаками подчеркивания: Member Number дает MBR_NO. Это все или ничего: синоним, запрещенное слово, текст, который не указан ни в одном слове, или слово без сокращения не составляют ничего, и имя остается прежним. Слова не привязывают домен, как и термин без домена, поэтому столбец сохраняет домен, к которому привязан.
  • Столбец, сформированное имя которого без учета регистра уже есть у другого столбца его таблицы, сохраняет свое имя, свое значение nameDerived и свой домен.
  • Очистка логического имени оставляет физическое имя как есть. Вызов, у которого логическое имя и то, что из него формируется, уже на месте, ничего не меняет и не создает шага отмены.

erd_derive_physical_names принимает scope: column с tableId и columnId — для этого столбца; table с tableId — для имени таблицы и всех ее столбцов; или document без идентификатора — для всех таблиц и их столбцов. Область, которой не хватает нужного идентификатора или которой передан идентификатор, который она не принимает, отклоняется. Каждое охваченное имя, у которого есть логическое имя, возвращается словарям, включая имя, написанное вручную, и получает то, что они дают теперь: физическое имя термина и, для столбца, его домен и тип либо составленное словами имя, которое оставляет домен столбца как есть. Логическое имя, из которого ничего не формируется, оставляет имя как есть, а поле nameDerived теперь равно true. Имя без логического имени остается как есть, как и столбец, новое имя которого уже есть у другого столбца его таблицы, например второй внешний ключ к одной и той же таблице, — он также сохраняет свое значение nameDerived. Один вызов erd_undo отменяет весь вызов. Имена импортированной схемы написаны вручную, поэтому, чтобы дать ей имена по словарям, задайте логические имена, а затем вызовите erd_derive_physical_names. Этот вызов дает собственное физическое имя термина, а изменение слов термина его заново не составляет. Поэтому после изменения слов термина сначала обновите термин: передайте его name с пустым physicalName, чтобы слова составили физическое имя заново, или передайте новый physicalName.

Версия ERD Editor, вышедшая до появления вкладки «Словарь», при сохранении файла удаляет из него логические имена, привязки к доменам и строки словарей, как это делают расширение VS Code до версии 4.2.0 и плагины для Obsidian и JetBrains до версии 1.2.0. Из них расширение версии 4.0.0 или 4.1.0 и плагины версии 1.0.0 или 1.1.0 по-прежнему редактируют вживую вместе с сервером, но не показывают и не сохраняют логические имена, привязки к доменам и строки словарей, которые записывает агент, — см. Обновление.

Настройки​

Агент задает настройки самой схемы: базу данных, ее имя и скрипты Схемы SQL. Все остальные настройки, которые хранит документ, пользователь задает в редакторе: режим отображения имен, переключатели Параметров вида, параметры вкладки «Настройки», язык и стили имен Генератора кода, тип кавычек и блокировки. Ни один инструмент их не меняет, кроме импорта в режиме replace: erd_import_json переносит настройки и блокировки загружаемого документа, а остальные четыре инструмента возвращают вид в начало холста — см. Импорт. В сервере версии 1.0.0 удалены инструменты, которые их задавали: erd_set_language, erd_set_table_name_case, erd_set_column_name_case, erd_set_bracket_type, erd_set_relationship_data_type_sync, erd_set_relationship_optimization, erd_set_column_order, erd_set_max_width_comment, erd_set_ignore_save_settings и erd_set_show.

erd_list и формат snapshot инструмента erd_read сообщают настройки в том виде, в каком их сохраняет файл, а lockSettings содержит по одному флагу на каждую блокировку: viewport, canvasType, language, tableNameCase, columnNameCase, bracketType и unlockNameViewMode. Последний флаг читается наоборот: он равен false, пока блокировка Name View включена, как в новом документе и в файле, сохраненном до появления этой блокировки, и true, когда пользователь ее выключает. Для заблокированного языка, стиля имен или типа кавычек сообщается заблокированное значение — то, которое хранит файл и с которым открывается любой редактор, что бы ни отображалось на экране редактора. Вид, вкладка и режим отображения имен не сообщаются. Агент читает и записывает логические имена, что бы ни показывал режим отображения имен.

erd_set_ddl_script создает шаг отмены. erd_set_database и erd_set_database_name его не создают, поэтому erd_undo не может их отменить.

ИнструментАргументыЧто делает
erd_set_databasevalueЗадает базу данных: MariaDB, MSSQL, MySQL, Oracle, PostgreSQL, SQLite, Databricks или Snowflake. От нее зависят типы данных базы данных и DDL, который выдает erd_read, если vendor не указан.
erd_set_database_namevalueЗадает имя базы данных, которое указывают заголовки use и createAndUse инструмента erd_read.
erd_set_ddl_scriptposition, sqlЗадает один из двух скриптов, которые записываются вокруг таблиц, — см. Скрипты перед таблицами и после них. position — это before, скрипт перед таблицами, например CREATE EXTENSION или CREATE SCHEMA, или after, скрипт после них, например GRANT или CREATE VIEW. sql заменяет весь скрипт (не более 10 000 символов), а пустая строка удаляет его. Сначала прочитайте текущий скрипт с помощью формата scripts инструмента erd_read.

Скрипт попадает в DDL любой базы данных как есть, поэтому пишите его для базы данных документа. Для MSSQL после скрипта, последняя строка которого не GO, добавляется строка GO. Версия ERD Editor, вышедшая до появления этих скриптов, при сохранении файла удаляет из него скрипты, как это делают расширение VS Code до версии 4.0.0 и плагины для Obsidian и JetBrains до версии 1.0.0, — см. Обновление.

Импорт​

Эти инструменты читают схему так же, как это делает меню «Импорт» редактора, — см. Импорт и экспорт файлов. Каждый из них принимает текст в аргументе value и аргумент mode: replace (по умолчанию) или append.

ИнструментАргументыЧто делает
erd_import_sqlvalue, mode?Загружает SQL DDL — операторы CREATE TABLE и подобные им.
erd_import_graphqlvalue, mode?Загружает GraphQL SDL.
erd_import_dbmlvalue, mode?Загружает DBML. Каждый блок TableGroup становится группой из перечисленных в нем таблиц — см. DBML.
erd_import_amlvalue, mode?Загружает AML.
erd_import_jsonvalue, mode?Загружает JSON-документ erd-editor, например другой файл .erd.json.

Режим replace заменяет документ, а erd_undo восстанавливает предыдущий:

  • erd_import_sql, erd_import_graphql, erd_import_dbml и erd_import_aml заменяют все таблицы, связи, индексы, заметки и группы таблиц. Они сохраняют настройки документа, включая блокировки, кроме вида, который возвращается в начало холста с масштабом 100%, а также сохраняют словари слов, терминов и доменов. Таблицы, которые они приносят, не имеют логических имен и не привязаны ни к одному домену.
  • erd_import_json заменяет весь документ, включая настройки и словари: настройки, блокировки, слова, термины и домены из JSON занимают место имеющихся в этом документе, а JSON, в котором не записаны блокировки, включает все блокировки и ставит вид в начало холста. У каждого пользователя остается его собственный режим отображения имен, если только в JSON не выключена блокировка Name View: тогда JSON приносит свой режим отображения имен. Чтобы сохранить настройки этого документа, возьмите за основу текст, который выдает формат json инструмента erd_read. Пустой текст дает новый документ, такой же, какой создает erd_open_document с аргументом create.

В редакторе с расширением VS Code версии 4.3.0 или новее либо плагином Obsidian или JetBrains версии 1.3.0 или новее импорт в режиме replace и его erd_undo или erd_redo тоже завершают рисуемую связь — см. Live.

Режим append добавляет импортированное в документ, как и Импорт с добавлением в редакторе, а один вызов erd_undo убирает все добавленное:

  • Содержимое текста появляется в виде новых сущностей с новыми идентификаторами — блоком ниже всего, что есть в документе, включая скрытые заметки и группы таблиц, с выравниванием по его левому краю. Все уже имеющиеся таблицы и настройки остаются, в том числе таблица с тем же именем: по имени ничего не объединяется.
  • Связи и индексы переносятся только между таблицами, которые приносит импорт, поэтому внешний ключ к таблице, которую текст не объявляет, отбрасывается.
  • erd_import_sql, erd_import_graphql и erd_import_aml добавляют таблицы с их связями и индексами, а erd_import_dbml — еще и свои группы таблиц. erd_import_json добавляет таблицы, связи, индексы, заметки и группы таблиц, но никогда — свои настройки, а пустой текст отклоняет. Его таблицы и столбцы приносят свои логические имена, но ни один столбец не привязывается к домену, и ни одно слово, термин или домен из JSON не переносится.

JSON-документ сохраняет собственное размещение, включая группы таблиц: в режиме replace таблицы стоят там, где их располагает документ, а в режиме append — так же, но внутри добавленного блока. Таблицы из SQL, GraphQL, DBML и AML расставляются рядами, начиная с таблиц с наименьшим числом столбцов, причем таблицы каждой группы остаются вместе, так же как их расставляет erd_sort_tables, и никогда не способом Flow, которым их по возможности размещает Импорт в самом редакторе. Эти четыре инструмента отклоняют пустой текст в любом режиме.

erd_batch​

erd_batch выполняет несколько инструментов редактирования по порядку как одну правку — все или ни одного.

  • operations содержит до 100 записей вида { tool, as?, args? }, где tool — инструмент редактирования, а args — аргументы инструмента без path. Инструмент чтения, например erd_list_checks, отклоняется.
  • Сначала операции пробно выполняются на копии документа. Отклоненная операция указывается, например operations[1] erd_remove_table: …, и ничего не применяется.
  • Один вызов erd_undo отменяет весь пакет, кроме операций, которые он не может отменить и которые называет поле undoNote результата: это операции инструментов, не создающих шага отмены, например erd_set_database, и операции, изменившие документ без создания шага отмены, например короткое перемещение erd_move_table_group. Пакет, который вообще не создал шага отмены, erd_undo пропускает. Поле historyEntries в результате считает записи в истории редактора внутри пакета, а не вызовы erd_undo.
  • В режиме Live редактор принимает либо весь пакет, либо ничего из него.

Агент не может знать идентификаторы, которые создаст пакет, до вызова, поэтому операция, названная с помощью as, позволяет последующей операции ссылаться на них: $name или $name.0 — на ее первый созданный идентификатор, $name.1 — на второй, а $name.last — на последний. Имя состоит из букв ASCII, цифр и знаков подчеркивания, не начинается с цифры и обозначает только одну операцию. Ссылка разрешается только там, где аргумент принимает идентификатор сущности, включая wordId, termId и domainId, поэтому имя или комментарий со значением $x остается текстом. Значение domainName тоже является текстом, но оно читается при выполнении своей операции, поэтому может называть домен, который добавила более ранняя операция пакета.

Таблица со столбцами и связью в одном вызове:

{
"path": "shop.erd.json",
"operations": [
{ "tool": "erd_add_table", "as": "users" },
{ "tool": "erd_change_table_name", "args": { "tableId": "$users", "value": "users" } },
{ "tool": "erd_add_column", "as": "uid", "args": { "tableId": "$users" } },
{ "tool": "erd_change_column_name", "args": { "tableId": "$users", "columnId": "$uid", "value": "id" } },
{ "tool": "erd_change_column_data_type", "args": { "tableId": "$users", "columnId": "$uid", "value": "BIGINT" } },
{ "tool": "erd_set_column_primary_key", "args": { "tableId": "$users", "columnId": "$uid", "value": true } },
{ "tool": "erd_add_table", "as": "orders" },
{ "tool": "erd_change_table_name", "args": { "tableId": "$orders", "value": "orders" } },
{ "tool": "erd_add_relationship", "args": { "startTableId": "$users", "endTableId": "$orders", "relationshipType": "ZeroN", "onDelete": "cascade" } }
]
}

Таблица users и ее ключ id получают имена до создания связи, поэтому связь добавляет в orders столбец внешнего ключа с именем users_id.

Слова, домен и термин, а затем таблица, имена которой формируются из них по ее логическим именам:

{
"path": "shop.erd.json",
"operations": [
{ "tool": "erd_add_word", "args": { "name": "Member", "abbreviation": "MBR" } },
{ "tool": "erd_add_word", "args": { "name": "Number", "abbreviation": "NO" } },
{ "tool": "erd_add_word", "args": { "name": "Name", "abbreviation": "NM" } },
{ "tool": "erd_add_domain", "as": "identifier", "args": { "name": "Identifier", "dataType": "INT" } },
{ "tool": "erd_add_term", "args": { "name": "Member Number", "domainId": "$identifier" } },
{ "tool": "erd_add_table", "as": "members" },
{ "tool": "erd_set_table_logical_name", "args": { "tableId": "$members", "value": "Member" } },
{ "tool": "erd_add_column", "as": "no", "args": { "tableId": "$members" } },
{ "tool": "erd_set_column_logical_name", "args": { "tableId": "$members", "columnId": "$no", "value": "Member Number" } },
{ "tool": "erd_add_column", "as": "nm", "args": { "tableId": "$members" } },
{ "tool": "erd_set_column_logical_name", "args": { "tableId": "$members", "columnId": "$nm", "value": "Member Name" } }
]
}

Термин составляет MBR_NO из своих слов, а таблица получает имя MBR. Столбец Member Number получает MBR_NO термина и его домен, поэтому он привязан к домену Identifier и имеет тип INT, а столбец Member Name, которого нет ни в одном термине, получает составленное имя MBR_NM.

Результаты​

Правка возвращает одну строку JSON:

{"tool":"erd_add_table","mode":"live","createdIds":["03h17be2plxpj5n59tqag7ogj"],"batches":1,"historyEntries":1}
ПолеЗначение
modelive или headless — см. Режимы Live и Headless.
savedРавно true в результате каждой правки, erd_batch, erd_undo и erd_redo в режиме Headless: к моменту ответа на вызов файл уже содержит изменение, поэтому сохранять нечего. В результате в режиме Live поля saved нет, так как изменение хранит редактор, — см. Сохранение.
createdIdsИдентификаторы всего, что создал вызов, по порядку.
batches, historyEntriesСколько пакетов изменений отправил вызов и сколько записей в истории редактора он создал.
undoable, undoNoteПоле undoable равно false, когда erd_undo пропустит вызов, а undoNote объясняет причину: инструмент не создает шага отмены, вызов изменил документ без создания шага отмены, как при перемещении erd_move_table_group меньше чем на 20 пикселей, или в документе уже было это значение. Результат erd_batch всегда содержит undoNote. Если пакет создал шаг отмены, в примечании сказано, что один вызов erd_undo отменяет пакет, и названы операции, которые он оставляет как есть; если не создал, результат содержит undoable: false, а в примечании сказано, что erd_undo его пропускает.
mismatchПрисутствует, если вызов создал другое число пакетов или записей в истории, чем объявляет инструмент.
notesПрисутствует, если в сеансе что-то изменилось, например редактор завершил работу или перестал обслуживать документ либо файл изменился на диске.

Отказ — это результат с ошибкой, содержащий код и сообщение о том, что делать:

{"error":{"code":"notFound","message":"tableId nope names no live table; read the document for current ids"}}
codeПричина
notFoundИдентификатору не соответствует ни одна существующая сущность, или файла не существует.
invalidArgsАргумент отсутствует или имеет неверное значение.
invalidPathПуть не указывает на ERD-документ. В Windows — также путь с именем, которое Windows не сохраняет в том виде, в каком оно написано, или путь, ведущий к документу, который числится в редакторе под другим путем, указанным в сообщении.
invalidDocumentФайл не является документом, который может прочитать редактор.
tooLargeРезультат чтения не помещается в один ответ.
blockedДокумент находится в редакторе с выключенным хабом. В сообщении сказано, как его включить: в VS Code отметьте рабочую область как доверенную и включите dineug.erd-editor.agentHub.enabled или перезагрузите окно; в Obsidian включите параметр Coding agents или перезагрузите Obsidian; в IDE JetBrains включите параметр Coding agents или, если он уже включен, перезапустите IDE.
hubDisabledДокумент находится в IDE JetBrains только в проекте, которому она не доверяет. Чтение по-прежнему работает; отметьте проект как доверенный, чтобы агент мог вносить правки.
conflictФайл изменился на диске во время вызова. Ничего не записано.
hubAppeared, hubGoneРедактор начал обслуживать документ, который агент редактировал на диске, или редактор, обслуживавший его, все еще работает, но его файл блокировки и соединение пропали. Ничего не записано.
notSavedИнструменту erd_save не удалось сохранить документ редактора.
readonlyДокумент находится в редакторе в режиме только для чтения, например файл, в который редактор не может записывать или который не может прочитать как диаграмму. Если редактора нет, сам файл доступен только для чтения, например файл Perforce или TFVC, который не извлечен для редактирования. Ничего не записано.
protocolMismatchРасширение или плагин ERD Editor в редакторе и сервер используют разные версии протокола, например сервер версии 1.0.0 или новее с расширением VS Code версии 3.x. Чтение тоже отклоняется, а в сообщении указано, какую сторону нужно обновить, — см. Обновление.
hubUnreachable, timeout, disconnectedХаб редактора не принял соединение, не ответил в течение 30 секунд или разорвал соединение во время вызова. В Windows код hubUnreachable также означает, что система Windows не допустила агента к хабу: редактор работает с более высокими правами, чем агент, например запущен от имени администратора, а агент — нет, либо агент работает в песочнице.

Другие коды встречаются реже, и каждый отказ содержит сообщение о том, что произошло.

Инструменты редактирования, erd_batch и четыре инструмента чтения отклоняют необъявленный аргумент или аргумент неверного типа с ошибкой JSON-RPC invalid params (-32602) еще до обращения к документу, поэтому аргумент с опечаткой никогда не отбрасывается молча. Пять инструментов сеанса игнорируют неизвестные им аргументы.