Spécification ouverte · anciennement DTQL

Des requêtes faciles à lire, comparer et fiables.

TugQL est un langage de requête portable et lisible par les humains. Il associe une syntaxe textuelle épurée inspirée du SQL à une représentation arborescente structurée 1:1 et sans perte (TugQT) sérialisée en YAML/JSON brut. Enregistrez une requête, modifiez-la à la main, comparez ses versions dans Git et exécutez-la sur plusieurs moteurs sans aucune perte.

Lire la spécification Voir un exemple $ 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 — Pourquoi TugQL

Une requête est une donnée. Traitez-la comme telle.

TugQL transforme une requête en un document clair et diffable que vous pouvez stocker, réviser et versionner — portable sur tous vos backends.

Lisible par les humains

Syntaxe de rédaction intuitive type SQL pour les développeurs, plus arbre de requêtes YAML/JSON (TugQT) pour l’outillage : accessible à tous pour inspection et modification.

Aller-retour sans perte

La simplification canonique reconstruit des requêtes structurellement identiques à la source. Rien n’est abandonné ou déformé silencieusement.

Validé par schéma

Publié avec validation JSON Schema intégrale (draft 2020-12). N’importe quel outil, dans n’importe quel langage, peut valider la structure d’une requête.

Idéal pour les diffs

Formatage canonique et sérialisation arborescente déterministe. Les requêtes enregistrées produisent des diffs nets dans Git et se relisent comme du code classique.

Portable par conception

TugQL expose des fonctionnalités universellement portables : une requête écrite une fois s’exécute à l’identique sur Git, SQLite, PostgreSQL ou Firestore.

Pas tout SQL

Un sous-ensemble portable volontairement ciblé et rigoureusement défini. Les constructions non portables sont explicitement rejetées plutôt que mal traduites.

02 — Exemple

Une requête en TugQL & TugQT

Rédigez en syntaxe textuelle TugQL ; conservez ou échangez sous forme d’arbre de requêtes structuré TugQT.

Les auteurs rédigent les requêtes dans la syntaxe textuelle TugQL — claire, compacte et proche du SQL. En sous-main, l’analyseur génère TugQT (Tug Query Tree), une représentation canonique lisible par machine.

Chaque nœud correspond de façon déterministe entre la syntaxe et l’arbre. Les erreurs de saisie ou de schéma renvoient des diagnostics exploitables avec localisation exacte.

Précision sur le nom : TugQL était auparavant nommé DTQL. Les documents et fichiers de requête DTQL existants restent pris en charge pour assurer la rétrocompatibilité.
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 — nœud → TugQT

Correspondance

Chaque nœud de requête couvert dispose d’une représentation structurée définie.

Nœud de requêteReprésentation TugQT
From sur une collection racinefrom: { name, alias? }
Colonneélément sous columns: — expression avec as: optionnel
Comparaison{ op, left, right }
Condition de groupe (And){ and: [ … ] }
Condition de groupe (Or){ or: [ … ] }
Expression d’ordreélément sous orderBy: — expression avec desc: true optionnel
Référence de champ{ field: <nom> }
Constante{ value: <scalaire> }
Tableau{ values: [ <scalaire>, … ] }
Opérateur==, In, >, >=, <, <=
Limite / Décalagelimit: <int> / offset: <int>

Une expression définit exactement un parmi field, value ou values, ce qui distingue une référence de champ, une constante ou un tableau.

04 — périmètre couvert

Ce que représente TugQL

Collections simples ou jointures, colonnes sélectionnées, expressions de filtrage, tri et pagination. Tout ce qui sort du périmètre est rejeté — jamais ignoré en silence.

Dans le périmètre

Sources de collections · colonnes sélectionnées · arbres de comparaison et groupes And/Or · tri · limit / offset · jointures · paramètres. Expressions : référence de champ, constante, tableau. Opérateurs : ==, !=, In, >, >=, <, <=, And, Or.

Hors périmètre (rejeté)

Jointures cartésiennes non bornées · syntaxe spécifique à un éditeur · opérateurs de mutation non typés hors schéma. La sérialisation échoue plutôt que de perdre la sémantique de la requête.

Sans perte & canonique

resolve(parse(text)) produit des arbres déterministes ; la sérialisation est canonique afin que les requêtes sauvegardées se comparent nettement d’une version à l’autre.

05 — environnements d’exécution

Une requête, plusieurs moteurs

TugQL constitue la surface de requête portable. Il s’appuie sur une couche d’abstraction de données (DALgo) qui l’adapte au stockage sous-jacent.

Parce que TugQL formalise le sous-ensemble portable, une requête écrite une fois se comporte de manière identique qu’elle s’exécute sur un dépôt Git (inGitDB), SQLite, PostgreSQL ou Firestore.

TugQLlangage de requête portable
DALgocouche d’abstraction de données
inGitDB SQLite PostgreSQL Firestore
Utilisé pour le développement produit

Explorez et interrogez vos données avec DataTug.

DataTug aide les développeurs à explorer les schémas de bases de données, construire et exécuter des requêtes et interpréter les résultats. L’intégration des contrats de requête avec TugQL et TugQT se poursuit. Découvrez les outils développés pour DataTug.

Enregistrez. Comparez. Exécutez partout.

TugQL fait de la requête un artefact révisable de premier ordre — lisible par les humains, validé par l’outillage et portable sur tous vos moteurs.