Valider et insérer¶
Objectif : valider chaque ligne d'un CSV, puis insérer les lignes valides.
Ce que vous allez apprendre : on décrit les colonnes attendues par des
FieldSpec, puis import_rows valide chaque ligne et appelle une fonction
insert que vous fournissez.
Le résultat est un ImportReport qui dit combien de lignes ont été insérées et
liste les erreurs rencontrées.
Premier palier du niveau intermédiaire de la progression Import/Export.
Module opt-in
Si forge-mvc-import-export n'est pas installé, l'import échoue.
Le cœur de Forge, lui, ne dépend jamais de ce paquet.
Ce que ce starter montre¶
- décrire les colonnes attendues avec
FieldSpec; - valider et insérer avec
import_rowset un callbackinsert; - lire le rapport
ImportReportet sesRowError.
Fonctions Forge utilisées¶
| Fonction | Rôle dans ce starter | Référence |
|---|---|---|
FieldSpec(name, required) |
Décrit une colonne attendue. | Opt-ins |
import_rows(rows, specs, insert) |
Valide les lignes, puis insère les valides. | Opt-ins |
ImportReport |
Rapport : lignes insérées et erreurs. | Opt-ins |
RowError |
Une erreur localisée (ligne, champ, message). | Opt-ins |
1. Décrire les colonnes et insérer¶
from forge_mvc_import_export import parse_csv, import_rows, FieldSpec
lignes = parse_csv("nom,ville\nAlice,Lyon\nBob,Nantes")
specs = [
FieldSpec(name="nom"),
FieldSpec(name="ville"),
]
inseres = []
def insert(record):
# Dans une vraie application, ce callback appelle le modèle,
# par exemple add_eleve(record). Le SQL reste côté application.
inseres.append(record)
rapport = import_rows(lignes, specs, insert)
print(rapport.imported) # 2
print(rapport.ok) # True
Comprendre ce code¶
- Chaque
FieldSpecnomme une colonne attendue ; par défaut elle est
required=True. import_rowsvalide chaque ligne, construit un dictionnaire validérecord,
puis appelleinsert(record)pour les lignes valides.insertest fourni par votre application : c'est lui qui écrit en base.
Le paquet ne connaît ni la base ni vos entités.- Le
ImportReportrenvoyé porteimported(nombre inséré) eterrors.
2. Lire les erreurs¶
from forge_mvc_import_export import parse_csv, import_rows, FieldSpec
lignes = parse_csv("nom,ville\nAlice,Lyon\n,Nantes")
specs = [FieldSpec(name="nom"), FieldSpec(name="ville")]
rapport = import_rows(lignes, specs, lambda record: None)
print(rapport.imported) # 0
for erreur in rapport.errors:
print(erreur.row, erreur.field, erreur.message)
# 2 nom valeur requise manquante
Comprendre ce code¶
- La deuxième ligne n'a pas de
nom:import_rowsproduit unRowError. RowError.rowest le numéro de la ligne de données, 1-based ; la ligne 2 ici.RowError.fieldindique la colonne fautive,RowError.messagele motif.- Par défaut, une seule ligne invalide empêche toute insertion :
imported
vaut 0. Ce comportement « tout ou rien » est détaillé au niveau avancé.
À retenir¶
FieldSpec(name, required)décrit une colonne attendue.import_rows(rows, specs, insert)valide puis insère via votre callback.ImportReport.imported,ImportReport.oketImportReport.errors
résument le résultat ; chaque erreur est unRowError.
Après ce starter¶
Vous savez valider et insérer des chaînes.
Voyons comment convertir les valeurs et gérer les colonnes facultatives.