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)

対応している構文
| 構文 | 例 |
|---|---|
| Project | Project 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 |
|---|---|---|
| PostgreSQL | GENERATED BY DEFAULT AS IDENTITY | CREATE TYPE |
| MySQL | AUTO_INCREMENT | 列の ENUM(...) |
| SQLite | INTEGER PRIMARY KEY AUTOINCREMENT | CHECK 制約 |
| SQL Server | IDENTITY(1,1) | CHECK 制約 |

逆方向に、既存の DDL や DB から DBML を作ることもできます。
コマンドラインと CI
joinery validate schema.dbml # 構文エラーがあれば終了コード 1
joinery lint schema.dbml # Lint の結果を JSON で出力
joinery fmt schema.dbml # コメントを残したまま整形
プルリクエストごとに検査すれば、壊れた DBML や設計ミスがマージされるのを防げます。