Files
roadwave/docs/adr/013-orm-acces-donnees.md
2026-01-31 11:45:11 +01:00

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 generate pour valider cohérence SQL/Go