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
| Dialecte | Driver | Quoting | Types speciaux |
|---|---|---|---|
| PostgreSQL | asyncpg | "name" | JSONB, UUID native, ARRAY |
| MySQL | aiomysql | `name` | JSON, ENUM |
| MariaDB | aiomysql | `name` | JSON, sequences |
| SQL Server | aioodbc + pyodbc | [name] | NVARCHAR, IDENTITY |
| SQLite | aiosqlite | "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) vsTOP n(MSSQL). - AUTO_INCREMENT :
SERIAL/IDENTITY/AUTOINCREMENTselon 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
encryptstrategy sur MSSQL : utiliseEncryptByKeyqui demande une cle dans master DB. Sinon fallback Python pyaes.- MySQL
JSONordering : pas de garantie d'ordre des keys,JSON_EXTRACTrenvoie selon dialecte. Eviter de comparer JSON brut. - SQLite type affinity :
INTEGERpeut stocker'42'string. Le seed applique des types stricts cote Python pour eviter les surprises.
Etendre vers un nouveau dialecte
Voir Extending DB adapters.