Offene Spezifikation · ehemals DTQL

Abfragen, die Sie lesen, diffen und vertrauen können.

TugQL ist eine portable, menschenlesbare Abfragesprache. Sie kombiniert eine saubere SQL-ähnliche Textsyntax mit einer verlustfreien 1:1-Darstellung als strukturierter Abfragebaum (TugQT), serialisiert in einfachem YAML/JSON. Speichern Sie eine Abfrage, bearbeiten Sie sie von Hand, überprüfen Sie Diffs in der Versionskontrolle und führen Sie sie verlustfrei über verschiedene Backends aus.

Spezifikation lesen Beispiel ansehen $ 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 — Warum TugQL

Eine Abfrage sind Daten. Behandeln Sie sie wie Daten.

TugQL macht aus einer Abfrage ein verständliches, diffbares Dokument, das Sie speichern, überprüfen und versionieren können — portabel auf jedem Backend.

Menschenlesbar

Intuitive SQL-ähnliche Syntax für Entwickler, plus einfacher YAML/JSON-Abfragebaum (TugQT) für Tools — jeder kann sie inspizieren, verstehen und bearbeiten.

Verlustfreier Roundtrip

Kanonische Transformation rekonstruiert Abfragen strukturell identisch zur Quelle. Nichts wird stillschweigend verworfen oder angenähert.

Schemavalidiert

Veröffentlicht mit vollständiger JSON-Schema-Validierung (Draft 2020-12). Jedes Tool in jeder Sprache kann Abfragestrukturen vor der Ausführung validieren.

Diff-freundlich

Kanonische Formatierung und deterministische Baum-Serialisierung. Gespeicherte Abfragen diffen sauber in Git und lassen sich wie Code reviewen.

Portabel durch Design

TugQL bietet Funktionalität, die über verschiedene Speicher hinweg portabel ist — dieselbe Abfrage läuft ohne Änderung auf Git, SQLite, PostgreSQL oder Firestore.

Kein volles SQL

Eine bewusst fokussierte, wohldefinierte portable Teilmenge. Nicht-portable Konstrukte werden explizit abgewiesen, statt gefährlich fehlübersetzt zu werden.

02 — Beispiel

Eine Abfrage als TugQL & TugQT

In TugQL-Textsyntax verfassen; als strukturierter TugQT-Abfragebaum speichern oder austauschen.

Abfragen werden in TugQL-Textsyntax verfasst — lesbar, kompakt und SQL-nah. Darunter erzeugt der Parser TugQT (Tug Query Tree), eine kanonische, maschinenlesbare Repräsentation.

Jeder Knoten wird deterministisch zwischen Syntax und Baum abgebildet. Fehlerhafte Eingaben oder Schemaverletzungen liefern präzise Diagnosen.

Hinweis zur Namensgebung: TugQL hieß früher DTQL. Bestehende DTQL-Dokumente und Abfragedateien werden zur Abwärtskompatibilität weiterhin unterstützt.
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 — Knoten → TugQT

Zuordnung

Jeder abgedeckte Abfrageknoten besitzt eine definierte strukturierte Darstellung.

AbfrageknotenTugQT-Darstellung
From über eine Quell-Sammlungfrom: { name, alias? }
SpalteElement unter columns: — Ausdruck mit optionalem as:
Vergleich{ op, left, right }
Gruppenbedingung (And){ and: [ … ] }
Gruppenbedingung (Or){ or: [ … ] }
SortierausdruckElement unter orderBy: — Ausdruck mit optionalem desc: true
Feldreferenz{ field: <name> }
Konstante{ value: <skalar> }
Array{ values: [ <skalar>, … ] }
Operator==, In, >, >=, <, <=
Limit / Offsetlimit: <int> / offset: <int>

Ein Ausdruck setzt genau eines von field, value oder values, was eine Feldreferenz, eine Konstante oder ein Array unterscheidet.

04 — abgedeckte Teilmenge

Was TugQL abbildet

Einzelsammlungen oder Verknüpfungen, Spaltenauswahl, Filterausdrücke, Sortierung und Paginierung. Alles außerhalb des Umfangs wird abgelehnt — niemals stillschweigend verworfen.

Im Umfang

Sammlungsquellen · ausgewählte Spalten · Vergleiche und And/Or-Bäume · Sortierung · Limit / Offset · Joins · Parameter. Ausdrücke: Feld, Konstante, Array. Operatoren: ==, !=, In, >, >=, <, <=, And, Or.

Außerhalb des Umfangs (abgelehnt)

Unbeschränkte kartesische Joins · herstellerspezifische Dialektsyntax · ungetypte Mutationsoperatoren außerhalb des Schemas. Die Serialisierung bricht ab, statt Semantik zu verlieren.

Verlustfrei & kanonisch

resolve(parse(text)) erzeugt deterministische Abfragebäume; die Serialisierung ist kanonisch, damit Diffs in Versionskontrollen sauber bleiben.

05 — wo es läuft

Eine Abfrage, viele Backends

TugQL ist die portable Abfrageebene. Es verbindet sich mit einer Datenabstraktionsschicht (DALgo), die es an den jeweiligen Speicher anpasst.

Weil TugQL die portable Teilmenge abbildet, verhält sich eine einmal geschriebene Abfrage identisch — egal ob auf einem Git-Repository (inGitDB), SQLite, PostgreSQL oder Firestore.

TugQLportable Abfragesprache
DALgoDatenabstraktionsschicht
inGitDB SQLite PostgreSQL Firestore
Einsatz in der Produktentwicklung

Daten erkunden und abfragen mit DataTug.

DataTug hilft Entwicklern beim Erkunden von Datenbankschemata, Erstellen und Ausführen von Abfragen und Verstehen der Ergebnisse. Die Arbeit an Abfrageverträgen mit TugQL und TugQT läuft kontinuierlich. Erkunden Sie die Werkzeuge hinter DataTug.

Speichern. Diffen. Überall ausführen.

TugQL macht eine Abfrage zu einem erstklassigen, überprüfbaren Artefakt — lesbar für Menschen, validiert von Werkzeugen und portabel auf allen Backends.