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)

Но всё равно получаю полное пересечение всех сущностей ?


Ответы (0 шт):