SQLAlchemy 外部キー制約の検証
SQLAlchemy では、外部キー制約により、参照元の列の値が参照先テーブルに存在することが保証されます。これはデータの整合性を維持するために不可欠です。ただし、参照される列の値が参照元の行も参照していることを確認するなど、より複雑な検証が必要な場合もあります。
次の例を考えてみましょう:
この場合、次のようにします。 choice_id が、対応する変数 (variable_id) に対して有効な option を参照していることを検証するデータベース制約を追加します。
検証にサブクエリを使用する
達成するにはこれにより、外部キー制約内でサブクエリを使用できます。
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"))
この制約により、SystemVariables の choice_id 値が に存在することが保証されます。 VariableOptions テーブルと、対応する variable_id VariableOptions は、SystemVariables の variable_id と一致します。
追加列を持つ拡張外部キー
、または、外部キーを拡張して両方を含めることができます。 option_id および 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") )
このメソッドでは、サブクエリの必要性がなくなり、前のアプローチと同じ検証が保証されます。
両方メソッドは、SQLAlchemy で複雑な外部キー制約を実装する効果的な方法を提供します。どのアプローチを選択するかは、アプリケーションの特定の要件によって異なります。
以上がSQLAlchemy で複雑な外部キー制約を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。