SQLAlchemy で、テーブル A に一連のレコードを書き込みたいと思います。次に、テーブル BI に、(アプリオリに) 未知数の A のレコードを参照するレコードを書き込みたいと思います。
Python の用語では、クラス A と B を作成し、タイプ A のオブジェクトを含むリストを B に作成します。
それはできますか?
SQLAlchemy で、テーブル A に一連のレコードを書き込みたいと思います。次に、テーブル BI に、(アプリオリに) 未知数の A のレコードを参照するレコードを書き込みたいと思います。
Python の用語では、クラス A と B を作成し、タイプ A のオブジェクトを含むリストを B に作成します。
それはできますか?
これは実際には SQLAlchemy に関する質問ではなく、基本的なリレーショナル テーブルに関する質問です。
1 対多の関係、または多対多の関係のいずれかについて話しているのですが、どちらも SQLAlchemy がそのままサポートしています。
1 対多の関係は、基本的な封じ込めの 1 つです。部門には多くの従業員がいますが、各従業員には 1 つの部門しかありません。この場合、外向きのリレーションシップが 1 つしかないクラスが外部キーを取得するため、従業員は部門を参照しますが、その逆ではありません。
SQLAlchemy ドキュメントの例は次のとおりです。
class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) children = relationship("Child") class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parent.id'))
したがって、A
クラスが 1 つのセットの一部にしかできない場合B
は、このパターンを使用してください。
多対多の関係とは、両側が他方の側の複数のインスタンスを参照できる関係です。従業員とプロジェクトについて考えてください。従業員は複数のプロジェクトの一部になることができ、プロジェクトには複数の従業員が関与する可能性があります。
SQL では、この種の関係には関連付けテーブルが必要です。これは、リンクされた 2 つの型の間のマッピングを保持する追加のデータベース テーブルです。多対多の関係に関する SQLAlchemy のドキュメントには、これを行う方法が明確に記載されています。例は次のとおりです。
association_table = Table('association', Base.metadata, Column('left_id', Integer, ForeignKey('left.id')), Column('right_id', Integer, ForeignKey('right.id')) ) class Parent(Base): __tablename__ = 'left' id = Column(Integer, primary_key=True) children = relationship("Child", secondary=association_table) class Child(Base): __tablename__ = 'right' id = Column(Integer, primary_key=True)
A
各オブジェクトが複数のB
セットの一部になる可能性がある場合は、このパターンを使用します。