0

SQLAlchemy で、テーブル A に一連のレコードを書き込みたいと思います。次に、テーブル BI に、(アプリオリに) 未知数の A のレコードを参照するレコードを書き込みたいと思います。

Python の用語では、クラス A と B を作成し、タイプ A のオブジェクトを含むリストを B に作成します。

それはできますか?

4

1 に答える 1

1

これは実際には 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セットの一部になる可能性がある場合は、このパターンを使用します。

于 2012-09-01T16:04:58.003 に答える