Aller au contenu principal

Multi-dialect

Auralith abstrait les differences entre dialectes SQL via un adapter pattern. Le code metier ne sait pas si la cible est Postgres ou SQL Server.

Bases supportees

DialecteDriverQuotingTypes speciaux
PostgreSQLasyncpg"name"JSONB, UUID native, ARRAY
MySQLaiomysql`name`JSON, ENUM
MariaDBaiomysql`name`JSON, sequences
SQL Serveraioodbc + pyodbc[name]NVARCHAR, IDENTITY
SQLiteaiosqlite"name"TEXT-only types

Bridges hostes

Au-dessus des dialectes natifs, des presets preconfigurent des hosts populaires :

  • Supabase (Postgres + SSL force)
  • Neon (Postgres + pooler hint)
  • PlanetScale (MySQL + "no transactions" hint)
  • Aurora PG / MySQL (driver natif + endpoint reader / writer)
  • CockroachDB (Postgres wire compatible)

Le connection_string_parser parse une connection string complete et applique les defaults du preset.

Adapter pattern

# backend/app/domain/services/db_adapter/postgres.py
class PostgresAdapter:
def quote_ident(self, name: str) -> str:
return f'"{name}"'

def limit_clause(self, n: int) -> str:
return f"LIMIT {n}"

async def introspect_tables(self, conn) -> list[Table]:
# Read information_schema.tables, columns, key_column_usage
...

Chaque dialecte implemente la meme interface. Les services metier (mass_patch_service, seed_service, etc.) consomment l'adapter sans hardcoding.

Differences notables

  • Quoting : "name" (PG, SQLite, MSSQL) vs `name` (MySQL, MariaDB) vs [name] (MSSQL legacy mode).
  • LIMIT : LIMIT n (PG / MySQL / SQLite) vs TOP n (MSSQL).
  • AUTO_INCREMENT : SERIAL / IDENTITY / AUTOINCREMENT selon dialecte.
  • Types : JSONB (PG only), JSON (MySQL / MariaDB), pas de JSON natif en MSSQL ou SQLite (stocke en NVARCHAR / TEXT).
  • Transactional DDL : Postgres et MSSQL supportent ; MySQL ne supporte pas pour la plupart des ALTER (auto-commit).

Pieges courants

  • encrypt strategy sur MSSQL : utilise EncryptByKey qui demande une cle dans master DB. Sinon fallback Python pyaes.
  • MySQL JSON ordering : pas de garantie d'ordre des keys, JSON_EXTRACT renvoie selon dialecte. Eviter de comparer JSON brut.
  • SQLite type affinity : INTEGER peut stocker '42' string. Le seed applique des types stricts cote Python pour eviter les surprises.

Etendre vers un nouveau dialecte

Voir Extending DB adapters.

Voir aussi