Feature · DBML

DBML エディタ:補完と Lint、図と SQL を同時に

DBML をテキストエディタで書くと、構文の誤りや設計ミスに気づくのは図にしてからです。Joinery のエディタは、書いている最中に補完し、指摘し、図と SQL を更新します。

DBML とは

DBML(Database Markup Language)は、テーブル・列・リレーションをテキストで書くためのオープンな記述言語です。SQL の CREATE TABLE より短く、方言に依存しないので、設計の段階でスキーマを書き留めるのに向いています。

Table customers {
  id bigint [pk, increment]
  email varchar(255) [not null, unique]
  Note: '取引先企業'
}

Table orders {
  id bigint [pk, increment]
  customer_id bigint [not null, ref: > customers.id]
  status order_status [not null, default: 'draft']
}

Enum order_status {
  draft
  confirmed
  shipped
}

Joinery のエディタでできること

  • 補完:型、列の設定(pk・not null・ref など)、テーブル名、列名を文脈に合わせて補完
  • Lint:主キーのないテーブル、外部キーと参照先の型の不一致、インデックスのない外部キーなど 8 種類を入力中に指摘
  • 図と同期:書いた内容がすぐ ER 図に反映され、図での編集はテキストの該当行だけを書き換え
  • 書きかけでも壊れない:構文エラーの間は、最後に正しく解析できた図を表示
  • 安全なリネーム:テーブル名・列名を変えると、参照・インデックス・グループまで一括で更新
  • 整形:コメントを残したまま整形(joinery fmt)
構文エラー中も直前の ER 図を表示している Joinery の画面
書きかけで構文エラーがあっても、図は直前の正しい状態のまま。

対応している構文

構文例
ProjectProject shop { database_type: 'PostgreSQL' }
スキーマ付きのテーブル・別名Table sales.orders as O
列の設定pk not null unique increment default note check
インデックス複合、式インデックス、unique、type: hash
リレーションインライン ref: >、独立した Ref:、複合キー、delete: cascade
Enum・TableGroup・Noteグループの色、テーブルのヘッダ色

独自の構文は足していないので、Joinery で書いた .dbml はほかの DBML 対応ツールでも読めます。解釈できないブロックがあっても、消さずにそのまま残します。

DBML を SQL に変換する

SQL タブには、選んだ方言の DDL が編集に合わせて表示されます。

方言自動採番Enum
PostgreSQLGENERATED BY DEFAULT AS IDENTITYCREATE TYPE
MySQLAUTO_INCREMENT列の ENUM(...)
SQLiteINTEGER PRIMARY KEY AUTOINCREMENTCHECK 制約
SQL ServerIDENTITY(1,1)CHECK 制約
DBML の隣に PostgreSQL の CREATE TABLE 文が表示された SQL タブ
DBML と、そこから生成した PostgreSQL の DDL。

逆方向に、既存の DDL や DB から DBML を作ることもできます。

コマンドラインと CI

joinery validate schema.dbml   # 構文エラーがあれば終了コード 1
joinery lint schema.dbml       # Lint の結果を JSON で出力
joinery fmt schema.dbml        # コメントを残したまま整形

プルリクエストごとに検査すれば、壊れた DBML や設計ミスがマージされるのを防げます。