【发布时间】:2017-11-20 07:57:53
【问题描述】:
如何在 SQLAlchemy(多态)中创建与多个表的声明性关系?
我有反映数据库中日记表的日记对象。它在相关表中保存类型和 id(作为外键)。我需要的是创建声明性类来映射这些表。
我无法更改数据库的结构,也无法创建额外的关联表。但我知道对象的标识符。
我试图让你在代码示例的底部看到。
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 …>]
【问题讨论】:
标签: python sqlalchemy