Le backend SQL Server dans Forge (forge-mvc-mssql)¶
Ce document explique ce que fait l'opt-in forge-mvc-mssql, ce qu'il expose, et comment on s'en sert.
forge-mvc-mssql est un backend de base de données pour Forge, au-dessus de pyodbc, pour faire fonctionner la couche BDD du cœur sur Microsoft SQL Server.
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.
Statut Alpha
La logique de dialecte (Transact-SQL) est testée unitairement, mais l'intégration serveur (pilote ODBC) et le provisioning par db:init restent à valider/câbler.
À ce stade, créez la base et le login à la main, puis utilisez db:apply / migration:*.
1. Rôle du module¶
Le cœur génère le SQL et pilote les commandes BDD ; un backend les fait parler à un vrai serveur.
forge-mvc-mssql fournit ce backend pour SQL Server : un adaptateur de connexion pyodbc conforme aux attentes du cœur, et un dialecte Transact-SQL.
Bonne nouvelle côté paramètres : pyodbc utilise nativement les ? de Forge, donc aucune traduction.
2. Vue d'ensemble rapide¶
| Élément | Valeur |
|---|---|
| Paquet | forge-mvc-mssql |
| Module | forge_mvc_mssql |
| Catégorie | Bases de données (ADR-055) |
| Statut | Alpha (dialecte testé, intégration à valider) |
| Couche | backend BDD opt-in exclusif (un seul par projet) |
| Dépend de | forge-mvc, pyodbc, un pilote ODBC, un serveur SQL Server |
| Découverte | entry point forge_mvc.db_backend nommé mssql |
| Sélection | automatique si seul installé ; sinon DB_BACKEND=mssql |
| Paramètres | ? natifs (pyodbc) : aucune traduction |
| Identité | BIGINT IDENTITY(1,1) |
| Pilote ODBC | « ODBC Driver 18 for SQL Server » par défaut (DB_ODBC_DRIVER) |
| Provisioning CLI | pas encore câblé : création base + login manuelle |
| Décision d'architecture | ADR-054 |
| Installation | pip install --pre forge-mvc-mssql |
3. Schémas UML¶
Les deux schémas suivants montrent deux vues complémentaires du backend.
Le diagramme de classe montre l'adaptateur et le dialecte.
Le diagramme de séquence montre une requête via pyodbc.
3.1 Diagramme de classe¶
Le diagramme de classe montre que le backend enveloppe pyodbc pour répondre au contrat du cœur.
classDiagram
direction LR
class DatabaseBackend {
<<protocol, cœur>>
+name
+dialect
+get_connection()
}
class MSSQLBackend {
+name = "mssql"
+requires_provisioning = true
+get_connection() connexion
}
class MSSQLDialect {
+BIGINT IDENTITY(1,1)
+identifiants [crochets]
+formes gardées IF OBJECT_ID
}
class pyodbc {
<<pilote ODBC>>
}
MSSQLBackend ..|> DatabaseBackend : implémente
MSSQLBackend --> pyodbc : connexion
MSSQLBackend --> MSSQLDialect : dialecte
À retenir :
- le backend enveloppe
pyodbc(curseur lignes-dict viadescription,lastrowidviaSCOPE_IDENTITY()) ; - les paramètres
?de Forge sont utilisés tels quels ; - le dialecte gère
IDENTITY, les crochets et les formes gardées ; pyodbcest importé paresseusement et requiert un pilote ODBC système.
3.2 Diagramme de séquence¶
Le diagramme de séquence montre une requête runtime via pyodbc.
sequenceDiagram
participant Core as core.database
participant Backend as forge-mvc-mssql
participant ODBC as pyodbc + pilote
participant Server as SQL Server
Core->>Backend: execute("... WHERE id = ?", (42,))
Backend->>ODBC: execute(sql, (42,)) (? natif)
ODBC->>Server: requête
Server-->>ODBC: lignes
Backend->>Backend: convertit en dicts (cursor.description)
Backend-->>Core: lignes (dict)
À retenir :
- aucune traduction de paramètres (pyodbc utilise
?) ; - les lignes pyodbc sont converties en dicts via
cursor.description; lastrowidest obtenu viaSELECT SCOPE_IDENTITY();- un pilote ODBC doit être installé sur la machine.
4. Ce que fournit le backend¶
| Élément | Rôle |
|---|---|
MSSQLBackend |
implémente le contrat DatabaseBackend |
Adaptateur pyodbc |
curseur lignes-dict, lastrowid via SCOPE_IDENTITY() |
MSSQLDialect |
BIGINT IDENTITY(1,1), crochets, CREATE INDEX gardés, INFORMATION_SCHEMA |
| Entry point | forge_mvc.db_backend = mssql |
5. Contextes d'utilisation¶
| Besoin | Élément |
|---|---|
| Utiliser SQL Server | installer forge-mvc-mssql + pilote ODBC + serveur |
| Forcer ce backend | DB_BACKEND=mssql |
| Choisir le pilote ODBC | DB_ODBC_DRIVER |
| Créer base et login | à la main (Alpha) |
| Appliquer le schéma | forge db:apply (sur une base existante) |
| Faire évoluer le schéma | forge migration:* |
6. Exemple d'utilisation (Alpha)¶
-- 1. Préparer base et login à la main (provisioning CLI non câblé)
CREATE DATABASE mon_projet;
CREATE LOGIN mon_projet WITH PASSWORD = '...';
-- puis CREATE USER + rôles dans la base
# 2. Installer le backend + pilote ODBC, configurer env/dev
pip install --pre forge-mvc-mssql
# 3. Appliquer le schéma
forge db:apply
Le code applicatif utilise core.database.db, comme avec tout autre backend.
Aide-mémoire
En Alpha :
- créez base et login à la main ;
db:apply/migration:*fonctionnent sur la base existante ;?est natif (pyodbc), pas de traduction.
7. Statut Alpha, ODBC et dialecte¶
Le dialecte Transact-SQL est testé unitairement ; l'intégration sur un vrai serveur reste à valider côté projet.
SQL Server n'a pas IF NOT EXISTS pour les tables : le dialecte émet des formes gardées (IF OBJECT_ID(...) IS NULL).
Pilote ODBC requis
pyodbc a besoin d'un pilote ODBC système (par défaut « ODBC Driver 18 for SQL Server »), surchargeable via DB_ODBC_DRIVER.
Sans pilote, la connexion échoue.
Dialecte SQL Server
BIGINT IDENTITY(1,1) pour l'identité, identifiants entre crochets [...], CREATE INDEX gardés, introspection via INFORMATION_SCHEMA.
Indépendance du cœur
Le cœur de Forge ne dépend pas de forge-mvc-mssql : il le découvre par entry point (ADR-054).
Voir aussi¶
- Progression SQL Server : apprendre le backend pas à pas.
- ADR-054 : cœur agnostique BDD.