SQLAlchemy relationship & autoload (reflection)
Использую DB autoload/reflecting для MySQL, есть проблема с описанием отношений. Попробовал использовать foreign_keys и primaryjoin следующим образом:
Base = declarative_base(metadata=metadata)
class Job(Base):
__tablename__ = 'tbl_job'
def __repr__(self):
return f'{self.id}. Job {self.title}'
class Person(DeferredReflection, Base):
__tablename__ = 'tbl_person'
job = relationship('Job', backref='workers',
foreign_keys='Person.job_id',
primaryjoin='Person.job_id==Job.id',
)
def __repr__(self):
return f'{self.id}. Person {self.name}'
Также попробовал сделать то же самое внутри декоратора @declared_attr.
Схема считывается корректно:
print([c for c in Person.__table__.columns])
[
Column('id', INTEGER(display_width=11), table=<tbl_person>, primary_key=True, nullable=False),
Column('name', VARCHAR(length=128), table=<tbl_person>, nullable=False),
Column('is_manager', TINYINT(display_width=1), table=<tbl_person>, nullable=False),
Column('created', DATETIME(fsp=6), table=<tbl_person>, nullable=False),
Column('updated', DATETIME(fsp=6), table=<tbl_person>, nullable=False),
Column('job_id', INTEGER(display_width=11), ForeignKey('tbl_job.id'), table=<tbl_person>),
]
Однако session.query(Person, Job).all() всё равно возвращает полное пересечение всех пар сущностей как если бы никакого relationship указано не было... Что здесь не так?
Upd. Ещё попробовал использовать AutoMap:
Base = automap_base(metadata=metadata)
class Job(Base):
__tablename__ = 'tbl_job'
def __repr__(self):
return f'{self.id}. Job {self.title}'
class Person(Base):
__tablename__ = 'tbl_person'
job = relationship('Job', backref='workers', foreign_keys='Job.id', primaryjoin='Person.job_id==Job.id')
## Пробовал и с @declared_attr def job(self)
def __repr__(self):
return f'{self.id}. Person {self.name}'
Base.prepare(engine, reflect=True)
Но всё равно получаю полное пересечение всех сущностей ?