Le backend SQLite dans Forge (forge-mvc-sqlite)¶
Ce document explique ce que fait l'opt-in forge-mvc-sqlite, ce qu'il expose, et comment on s'en sert.
forge-mvc-sqlite est un backend de base de données pour Forge : il fait fonctionner la couche BDD du cœur au-dessus de sqlite3 (bibliothèque standard), sans serveur ni dépendance externe.
Le cœur de Forge est agnostique BDD (ADR-054) : il découvre le backend installé par un entry point, et n'en utilise qu'un seul par projet.
1. Rôle du module¶
Le cœur sait générer du SQL et piloter db:init / db:apply / migration:*, mais il ne parle à aucune base directement : c'est le rôle d'un backend.
forge-mvc-sqlite fournit ce backend : une connexion sqlite3 adaptée aux attentes du cœur (curseur lignes-dict, lastrowid, autocommit) et un dialecte SQL propre à SQLite.
SQLite est sans serveur : la base est un simple fichier (DB_NAME). C'est le choix idéal en développement, en test et pour l'onboarding.
2. Vue d'ensemble rapide¶
| Élément | Valeur |
|---|---|
| Paquet | forge-mvc-sqlite |
| Module | forge_mvc_sqlite |
| Catégorie | Bases de données (ADR-055) |
| Couche | backend BDD opt-in exclusif (un seul par projet) |
| Dépend de | forge-mvc (et sqlite3 de la bibliothèque standard) |
| Découverte | entry point forge_mvc.db_backend nommé sqlite |
| Sélection | automatique si seul installé ; sinon DB_BACKEND=sqlite |
| Provisioning | aucun (sans serveur) : db:init crée le fichier |
| Base | un fichier sur disque (chemin = DB_NAME) |
| Décision d'architecture | ADR-054 (cœur agnostique BDD) |
| Installation | pip install --pre forge-mvc-sqlite |
3. Schémas UML¶
Les deux schémas suivants montrent deux vues complémentaires du backend.
Le diagramme de classe montre comment le cœur consomme le backend.
Le diagramme de séquence montre la résolution du backend puis une requête.
3.1 Diagramme de classe¶
Le diagramme de classe montre que le cœur résout un DatabaseBackend par entry point, et que forge-mvc-sqlite le fournit avec son dialecte.
classDiagram
direction LR
class DatabaseBackend {
<<protocol, cœur>>
+name
+dialect
+requires_provisioning
+get_connection()
}
class SQLiteBackend {
+name = "sqlite"
+requires_provisioning = false
+get_connection() connexion
}
class SQLiteDialect {
+types SQLite
+AUTOINCREMENT
+CREATE INDEX séparés
}
class fichier {
<<base>>
+DB_NAME (fichier)
}
SQLiteBackend ..|> DatabaseBackend : implémente
SQLiteBackend --> SQLiteDialect : dialecte
SQLiteBackend --> fichier : ouvre
À retenir :
- le cœur ne connaît que le contrat
DatabaseBackend; forge-mvc-sqlitel'implémente au-dessus desqlite3;- le dialecte traduit les types et la DDL en SQL SQLite ;
- la base est un fichier, pas un service.
3.2 Diagramme de séquence¶
Le diagramme de séquence montre la découverte du backend puis une requête applicative.
sequenceDiagram
participant App as Application / CLI
participant Core as core.database
participant Backend as forge-mvc-sqlite
participant File as fichier SQLite
App->>Core: première requête (ou db:init)
Core->>Core: résout l'entry point forge_mvc.db_backend
Core->>Backend: get_connection()
Backend->>File: ouvre DB_NAME
Backend-->>Core: connexion (lignes-dict, lastrowid)
Core-->>App: résultat de la requête
À retenir :
- le backend est résolu une fois, par entry point ;
- s'il y a plusieurs backends installés,
DB_BACKENDtranche ; - la connexion est adaptée au format attendu par le cœur ;
- aucune étape réseau : c'est un fichier local.
4. Ce que fournit le backend¶
| Élément | Rôle |
|---|---|
SQLiteBackend |
implémente le contrat DatabaseBackend du cœur |
| Adaptateur de connexion | curseur dictionary=, lastrowid, autocommit au-dessus de sqlite3 |
SQLiteDialect |
types SQLite, INTEGER PRIMARY KEY AUTOINCREMENT, CREATE INDEX séparés |
| Entry point | forge_mvc.db_backend = sqlite (découverte par le cœur) |
L'API que vous utilisez reste celle du cœur : db:init, db:apply, migration:*, et core.database.db dans le code.
5. Contextes d'utilisation¶
| Besoin | Élément |
|---|---|
| Démarrer sans installer de serveur | installer forge-mvc-sqlite |
| Forcer ce backend | DB_BACKEND=sqlite |
| Créer la base | forge db:init (crée le fichier) |
| Appliquer le schéma | forge db:apply |
| Faire évoluer le schéma | forge migration:make / migration:apply |
| Lire/écrire en code | core.database.db |
6. Exemple d'utilisation¶
pip install --pre forge-mvc-sqlite # seul backend installé
forge db:init # crée le fichier SQLite + forge_migrations
forge db:apply # applique le schéma des entités
Le code applicatif ne sait pas qu'il parle à SQLite : il utilise la couche BDD du cœur.
Aide-mémoire
Installer suffit :
- un seul backend installé est choisi automatiquement ;
db:initcrée le fichier,db:applyapplique le schéma ;- le code utilise
core.database.db, passqlite3.
7. Sans serveur, exclusif, et dialecte¶
SQLite n'a pas de serveur : requires_provisioning=False, donc db:init ne crée ni compte ni base distante, il prépare le fichier et la table forge_migrations.
Un seul backend BDD par projet : si plusieurs sont installés, fixez DB_BACKEND pour lever l'ambiguïté.
Idéal en développement et en test
Pas d'installation de serveur, une base = un fichier : on démarre en une commande.
Pour la production multi-utilisateurs, un backend serveur (MariaDB, PostgreSQL) est généralement préférable.
Dialecte SQLite
Le dialecte gère les spécificités : INTEGER PRIMARY KEY AUTOINCREMENT, CREATE INDEX en instructions séparées, affinités de types.
Le SQL généré reste lisible (principe 5).
Indépendance du cœur
Le cœur de Forge ne dépend pas de forge-mvc-sqlite : il le découvre par entry point (ADR-054).
Voir aussi¶
- Progression SQLite : apprendre le backend pas à pas.
- ADR-054 : cœur agnostique BDD.