1.8 KiB
1.8 KiB
ADR-013 : ORM et Accès Données
Statut : Accepté Date : 2025-01-20
Contexte
RoadWave nécessite des requêtes SQL complexes (PostGIS géospatiales) avec performance optimale et type safety. Le choix entre ORM, query builder ou SQL brut impacte maintenabilité et performance.
Décision
sqlc pour génération de code Go type-safe depuis SQL.
Alternatives considérées
| Solution | Performance | Type Safety | Contrôle SQL | Courbe apprentissage |
|---|---|---|---|---|
| sqlc | Excellente | Très haute | Total | Faible |
| GORM | Moyenne | Moyenne | Limité | Faible |
| pgx + SQL brut | Excellente | Faible | Total | Moyenne |
| sqlx | Bonne | Faible | Total | Faible |
Justification
- Performance : Génération compile-time, zero overhead runtime
- Type safety : Structs Go générées automatiquement, erreurs détectées à la compilation
- Contrôle SQL : Requêtes PostGIS complexes écrites en pur SQL (pas de limitations ORM)
- Maintenabilité : Modifications SQL →
sqlc generate→ code mis à jour - Simplicité : Pas de magic, code généré lisible et debuggable
Workflow
-- queries/content.sql
-- name: GetContentNearby :many
SELECT id, title, ST_Distance(location, $1::geography) as distance
FROM contents
WHERE ST_DWithin(location, $1::geography, $2)
ORDER BY distance
LIMIT $3;
sqlc generate
// Code Go type-safe généré automatiquement
contents, err := q.GetContentNearby(ctx, location, radius, limit)
Conséquences
- Dépendance :
github.com/sqlc-dev/sqlc - Fichier
sqlc.yamlà la racine pour configuration - Migrations gérées séparément avec
golang-migrate - CI doit exécuter
sqlc generatepour valider cohérence SQL/Go