Les validations sont une méthode permettant de garantir que nos bases de données reçoivent uniquement le type d'informations approprié pour chaque attribut. Après tout, nous ne voudrions pas qu’un type de données surprise se retrouve dans notre code et provoque un comportement inattendu. Heureusement, SQLAlchemy dispose d'un package qui rend les validations rapides et faciles !
Regardons quelques exemples simples. Imaginez que nous avons un modèle simple, Sandwich. Ici, nous avons déjà initialisé notre base de données et l'importons à partir d'un fichier de configuration.
from config import db class Sandwich(db.Model): __tablename__ = 'sandwiches' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) description = db.Column(db.String) price = db.Column(db.Float)
Si nous souhaitons ajouter des validations à l'un de ces attributs, nous devrons d'abord importer le package de validations.
à partir de l'importation sqlalchemy.orm valide
Et puis, écrivez notre fonction avec le décorateur '@validates' à l'intérieur du modèle.
@validates('name') def validate_name(self, key, value): if not value: raise ValueError('Name cannot be empty.') if type(value) != str: raise ValueError('Name must be a string.') return value
Alors, que se passe-t-il ici ? Décomposons-le. Le @validates est un décorateur qui permet à notre ORM de transmettre toutes les valeurs reçues avec la clé 'name' via notre fonction de validation avant de les ajouter à la base de données. La valeur que nous renvoyons est celle qui est finalement donnée à notre base de données. L'argument "clé" est la clé qui est évaluée, dans ce cas "nom", la valeur est la valeur de cette clé, donc le nom réel (espérons-le en texte) que nous essayons d'ajouter. Nous vérifions donc ici que l'attribut name transmis n'est pas vide et qu'il s'agit en fait d'une chaîne. Sinon, nous générons une erreur.
Nous pouvons également exécuter plusieurs attributs via le même décorateur en les ajoutant à ses arguments.
@validates('name', 'description') def validate_text(self, key, value): if not value: raise ValueError(f'{key} cannot be empty.') if type(value) != str: raise ValueError(f'{key} must be a string.') return value
Cette fonction valide nos attributs de nom et de description, mais nous n'aurons généralement pas les mêmes validations à effectuer sur différents attributs. En fonction des différences et du nombre de validations dont nous disposons, nous pouvons procéder de différentes manières. Nous pouvons exécuter un validateur distinct pour nos autres attributs, ajoutons également une validation de longueur pour notre description et nos validations de prix :
@validates('name') def validate_name(self, key, value): if not value: raise ValueError('Name cannot be empty.') if type(value) != str: raise ValueError('Name must be a string.') return value @validates('description') def validate_description(self, key, value): if not value: raise ValueError('Description cannot be empty.') if type(value) != str: raise ValueError('Description must be a string.') if not 10 <p>Ou, nous pouvons conserver le même validateur pour les deux et utiliser l'argument clé transmis pour ajuster les validations exécutées pour chaque attribut.<br> </p> <pre class="brush:php;toolbar:false"> @validates('name', 'description', 'price') def validate(self, key, value): if key != 'price: if not value: raise ValueError(f'{key} cannot be empty.') if type(value) != str: raise ValueError(f'{key} must be string.') if key == 'description': if not 10 <p>Hmm, c'est un peu compliqué, refactorisons en 2 validateurs distincts.<br> </p> <pre class="brush:php;toolbar:false"> @validates('name', 'description') def validate_text(self, key, value): if not value: raise ValueError(f'{key} cannot be empty.') if type(value) != str: raise ValueError(f'{key} must be string.') if key == 'description': if not 10 <p>C'est mieux ! Voici notre modèle terminé :<br> </p> <pre class="brush:php;toolbar:false">from sqlalchemy.orm import validates from config import db class Sandwich(db.Model): __tablename__ = 'sandwiches' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) description = db.Column(db.String) price = db.Column(db.Float) @validates('name', 'description') def validate_text(self, key, value): if not value: raise ValueError(f'{key} cannot be empty.') if type(value) != str: raise ValueError(f'{key} must be string.') if key == 'description': if not 10 <p>C'est ça ! Les validations sont un outil simple pour garantir que vos bases de données restent correctes.</p>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!