Wie kann ich deklarative Beziehung zu mehreren Tabellen in SQLAlchemy (polimorphe) erstellen?Wie kann ich eine deklarative Beziehung zu mehreren Tabellen in SQLAlchemy (polimorph) erstellen
Ich habe Journal-Objekt, das Journal-Tabelle in der Datenbank widerspiegelt. Es enthält Typ und ID (als Fremdschlüssel) in der relevanten Tabelle. Was ich brauche, um eine deklarative Klasse zu erstellen, um diese Tabellen zuzuordnen.
Die Struktur der Datenbank kann nicht geändert werden und kann keine zusätzliche Zuordnungstabelle erstellen. Aber ich kenne Identifikator für Gegenstände.
Was ich versuche zu bekommen, können Sie am Ende des Codebeispiels sehen.
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 …>]