Initial commit
This commit is contained in:
57
docs/adr/013-orm-acces-donnees.md
Normal file
57
docs/adr/013-orm-acces-donnees.md
Normal file
@@ -0,0 +1,57 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user