Validation de contrainte de clé étrangère SQLAlchemy
Dans SQLAlchemy, une contrainte de clé étrangère garantit que la valeur de la colonne de référence existe dans la table référencée. Ceci est essentiel pour maintenir l’intégrité des données. Cependant, nous avons parfois besoin d'une validation plus complexe, par exemple pour garantir que la valeur de la colonne référencée fait également référence à la ligne de référence.
Considérez l'exemple suivant :
Dans ce cas, nous souhaitons ajouter une base de données contrainte qui vérifie que choice_id fait référence à une option valide pour la variable correspondante (variable_id).
Utilisation d'une sous-requête pour la Validation
Pour y parvenir, nous pouvons utiliser une sous-requête au sein de la contrainte de clé étrangère :
import sqlalchemy as sa class SystemVariable(sa.Model): __tablename__ = "systemvariables" variable_id = sa.Column(sa.Integer, primary_key=True) variable = sa.Column(sa.String) choice_id = sa.Column( sa.Integer, sa.ForeignKey("variableoptions.option_id"), sa.CheckConstraint( "variable_id IN (SELECT variable_id FROM variableoptions WHERE option_id = choice_id)" ) ) class VariableOption(sa.Model): __tablename__ = "variableoptions" option_id = sa.Column(sa.Integer, primary_key=True) option = sa.Column(sa.String) variable_id = sa.Column(sa.Integer, sa.ForeignKey("systemvariables.variable_id"))
Cette contrainte garantit que la valeur choice_id dans SystemVariables est présente dans la table VariableOptions et que le variable_id correspondant dans VariableOptions correspond au variable_id dans SystemVariables.
Clé étrangère étendue avec colonne supplémentaire
Alternativement , nous pouvons étendre la clé étrangère pour inclure les deux option_id et variable_id :
class SystemVariable(sa.Model): __tablename__ = "systemvariables" variable_id = sa.Column(sa.Integer, primary_key=True) variable = sa.Column(sa.String) choice_id = sa.Column( sa.Integer, sa.ForeignKey("variableoptions.option_id") ) variable_id_option = sa.Column( sa.Integer, sa.ForeignKey("variableoptions.variable_id") )
Cette méthode élimine le besoin d'une sous-requête et garantit la même validation que l'approche précédente.
Les deux Les méthodes fournissent des moyens efficaces d’implémenter des contraintes de clé étrangère complexes dans SQLAlchemy. Le choix de l'approche dépend des exigences spécifiques de l'application.
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!