# 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 ```sql -- 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; ``` ```bash sqlc generate ``` ```go // 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