0
SQLAlchemy(ポリモーフィック)の複数のテーブルに対して宣言的関係を作成するにはどうすればよいですか?SQLAlchemy(ポリモーフィック)の複数のテーブルに対して宣言的関係を作成する方法
データベースのジャーナルテーブルを反映するJournalオブジェクトがあります。関連するテーブルに型とid(外部キーとして)を保持します。このテーブルをマップする宣言クラスを作成するために必要なもの。
データベースiの構造は変更できません。追加の関連テーブルを作成することはできません。しかし、私はオブジェクトの識別子を知っています。
コードサンプルの一番下に表示されています。
engine = create_engine('sqlite://', echo=True)
metadata = MetaData(bind=engine)
Base = declarative_base(bind=metadata)
DBSession = sessionmaker(bind=engine, autocommit=False, expire_on_commit=False)
session = DBSession()
class Person(Base):
__abstract__ = True
class Manager(Person):
__tablename__ = 'managers'
identifier = '01'
id = Column(Integer, primary_key=True)
name = Column(String(50))
manager_data = Column(String(40))
__mapper_args__ = {
'polymorphic_identity': identifier,
}
class Engineer(Person):
__tablename__ = 'engineers'
identifier = '02'
id = Column(Integer, primary_key=True)
name = Column(String(50))
engineer_info = Column(String(40))
__mapper_args__ = {
'polymorphic_identity': identifier,
}
class Journal(Base):
__tablename__ = 'journal'
identifier = '03'
id = Column(Integer, primary_key=True)
date = Column(Date)
type = Column(String(50))
person_id = Column(Integer)
person = relationship() # can’t figure out this relationship
__mapper_args__ = {
'polymorphic_on': type,
'with_polymorphic': '*'
}
if __name__ == '__main__':
metadata.create_all()
en1 = Engineer(id=1)
mn1 = Manager(id=2)
session.add_all([en1, mn1])
session.commit()
j1 = Journal(person=en1)
# -> INSERT INTO Journal (type, person_id) VALUES (’02’, 1)
j2 = Journal(person=mn1)
# -> INSERT INTO Journal (type, person_id) VALUES (‘01’, 2)
for row in session.query(Journal):
print(row, row.person)
# -> [<Journal …>, <Manager …>]
# -> [<Journal …>, <Engineer …>]
for row in session.query(Journal).filter(Journal.type == Manager.identifier):
print(row, row.person)
# -> [<Journal …>, <Manager …>]