开放规范 · 原名 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)。任何语言的任何工具都可以在执行前验证查询结构的正确性。

版本控制友好

规范的格式化与确定性的语法树序列化。保存的查询在 Git 中呈现干净清晰的 diff,能像代码一样进行 code review。

天生具备跨平台便携性

TugQL 提炼了跨后端通用的核心能力,因此同一个查询无需更改即可直接运行于 Git、SQLite、PostgreSQL 或 Firestore。

并非全量 SQL

刻意聚焦于定义明确的便携式子集。非通用语法会被明确拒绝,而不是进行具有不可预知风险的转换。

02 — 示例

TugQL 文本语法与 TugQT 树

使用 TugQL 文本语法编写;以 TugQT 结构化查询树格式存储或传输。

开发者使用 TugQL 文本语法编写查询——清晰、紧凑且类似 SQL。在底层,解析器生成 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 表示方式
根集合的 From 查询from: { 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 中的恰好一项,以此区分字段引用、常量或数组。

04 — 覆盖子集

TugQL 支持的特性范围

单个集合来源或连接树、选定列、过滤表达式、排序和分页。任何超出范围的内容都会被明确拒绝——绝不会悄悄丢弃。

支持范围内

集合源 · 选定列 · 比较及 And/Or 树 · 排序 · limit / offset · 连接 · 参数。表达式:字段引用、常量、数组。运算符:==, !=, In, >, >=, <, <=, And, Or。

超出范围(报错拒绝)

无约束的笛卡尔积 · 厂商特定的私有 SQL 方言 · 缺乏模式约束的无类型修改操作。序列化时会直接报错,确保绝不破坏查询语义。

无损且规范

resolve(parse(text)) 生成确定性的查询树;序列化具有规范性,因此保存的查询能够在不同版本之间清晰呈现 diff。

05 — 运行环境

一次编写,多端运行

TugQL 是通用的便携查询层。它映射到底层数据抽象层(DALgo),后者将其适配到底层的各种存储引擎中。

因为 TugQL 仅表达跨平台的通用子集,所以编写一次的查询在 Git 仓库(inGitDB)、嵌入式 SQLite 文件、PostgreSQL 数据库或 Firestore 上的行为完全一致。

TugQL便携查询语言
DALgo数据抽象层
inGitDB SQLite PostgreSQL Firestore
应用于真实产品开发

使用 DataTug 探索并查询数据。

DataTug 帮助开发者浏览数据库模式、构建并运行查询并深入分析结果。其基于 TugQL 和 TugQT 的查询协议研发正在持续推进。探索 DataTug 背后的工具。

保存它。比对它。随处运行它。

TugQL 让查询成为一等公民的审查产物——人类可读、工具可验证,并且能在多种后端之间无缝移植。