オープン仕様 · 旧称 DTQL

読める、 差分が取れる、信頼できるクエリ。

TugQLは、ポータブルで人間が読みやすいクエリ言語です。洗練されたSQL風テキスト構文と、プレーンなYAML/JSONとしてシリアライズ可能な1:1完全ロスレスの構造化クエリツリー(TugQT)を融合。クエリを保存し、手作業で編集し、バージョン管理で差分を確認し、複数のバックエンドで情報の欠落なく実行できます。

仕様を読む 例を見る $ go get github.com/dal-go/dalgo/dtql
query.tugql TugQL
from users as u
select
  u.name,
  u.age as years
where
  u.age >= 18
  and (u.status in ('active', 'pending') or u.country == 'US')
order by
  u.name,
  u.age desc
limit 10
offset 20
01 — TugQLが選ばれる理由

クエリはデータです。データとして扱いましょう。

TugQLはクエリを、保存・レビュー・バージョン管理が可能な、理解しやすく差分が取れるドキュメントへと変革します。あらゆるバックエンドで動作します。

高い可読性

人間にとって直感的なSQL風の記述構文に加え、ツール向けにはプレーンなYAML/JSONクエリツリー(TugQT)を提供。誰でも検証・理解・編集が可能です。

ロスレスな相互変換

正規化処理により、元のクエリと構造的に同等なクエリを正確に復元。暗黙的に破棄されたり、変形されたりすることはありません。

スキーマ検証済み

完全なJSON Schema(Draft 2020-12)とともに公開。あらゆる言語のあらゆるツールで、実行前にクエリ構造を検証できます。

差分(Diff)に強い

正規フォーマットと決定論的なツリーシリアライズ。保存されたクエリはGitで綺麗に差分が表示され、通常のコードと同様にレビューできます。

設計段階からのポータビリティ

バックエンド間で移植可能な機能に絞り込んでいるため、1つのクエリがGit、SQLite、PostgreSQL、Firestore上でそのまま動作します。

完全なSQLではない理由

あえてポータブルなサブセットに集中して厳密に定義。非互換な構文は危険に変換せず、明確にエラーとして拒絶します。

02 — 例

TugQLテキスト構文とTugQTツリー

TugQLテキスト構文で記述し、構造化クエリツリーTugQTとして永続化・交換します。

ユーザーは親しみやすく簡潔なTugQLテキスト構文でクエリを記述します。パーサーはそれを機械可読な正規表現であるTugQT(Tug Query Tree)へと変換します。

すべてのノードが構文とツリーの間で決定論的に対応します。不正な入力やスキーマ違反は、ソース上の正確な位置を明示した診断メッセージを返します。

名称に関する注意: TugQLは旧称DTQLとして知られていました。既存のDTQLドキュメントやクエリファイルも後方互換性のために継続サポートされます。
users.tugqt.yaml YAML
from:
  name: users
columns:
  - field: name
  - field: age
    as: years
where:
  and:
    - op: '>='
      left:
        field: age
      right:
        value: 18
    - or:
        - op: In
          left:
            field: status
          right:
            values:
              - active
              - pending
        - op: ==
          left:
            field: country
          right:
            value: US
orderBy:
  - field: name
  - field: age
    desc: true
limit: 10
offset: 20
03 — ノード → TugQT

マッピング

対象範囲内の各クエリノードには、明確に定義された構造化表現が存在します。

クエリノードTugQT表現
ルートコレクションに対するFromfrom: { name, alias? }
カラムcolumns: 配下の要素 — 式と任意の as:
比較{ op, left, right }
グループ条件(And){ and: [ … ] }
グループ条件(Or){ or: [ … ] }
順序式orderBy: 配下の要素 — 式と任意の desc: true
フィールド参照{ field: <name> }
定数{ value: <scalar> }
配列{ values: [ <scalar>, … ] }
演算子==, In, >, >=, <, <=
Limit / Offsetlimit: <int> / offset: <int>

式には field、value、values のいずれか1つだけを設定し、フィールド参照、定数、配列を識別します。

04 — 対応サブセット

TugQLがサポートする範囲

単一コレクションまたは結合ツリー、カラム選択、フィルタ式、並び替え、ページネーション。範囲外の構文は拒絶され、勝手に無視されることはありません。

対象範囲内

コレクションソース · 選択カラム · 比較およびAnd/Orグループツリー · 並び替え · limit / offset · 結合 · パラメータ。式: フィールド参照、定数、配列。演算子: ==, !=, In, >, >=, <, <=, And, Or。

対象外(拒絶される構文)

制限のない直積結合 · 特定DB専用のベンダー構文 · スキーマ管理外の非型付け更新演算子。セマンティクスが損なわれる前にシリアライズがエラー終了します。

ロスレス&正規化

resolve(parse(text)) は決定論的なクエリツリーを生成します。シリアライズも正規化されているため、保存されたクエリはGitで綺麗に差分比較できます。

05 — 動作環境

1つのクエリ、多彩なバックエンド

TugQLはポータブルなクエリ層です。データ抽象化レイヤー(DALgo)を介して、背後にあるあらゆるストレージへと適合させます。

TugQLがポータブルなサブセットのみを表現するため、一度記述したクエリはGitリポジトリ(inGitDB)、SQLite、PostgreSQL、Firestoreのいずれに対しても一貫して動作します。

TugQLポータブルクエリ言語
DALgoデータ抽象化レイヤー
inGitDB SQLite PostgreSQL Firestore
実際のプロダクト開発での採用

DataTugでデータを探索し、クエリを実行。

DataTugは開発者がデータベーススキーマを探索し、クエリを作成・実行し、結果を理解することを支援します。TugQLおよびTugQTとのクエリ連携は現在も進行中です。DataTugの基盤ツールを見る。

保存する。差分を見る。どこでも動かす。

TugQLはクエリをファーストクラスのレビュー可能な成果物へと進化させます — 人間が読め、ツールで検証され、あらゆるバックエンドで動作します。