sqlalchemy: многократное присоединение к одной и той же таблице с помощью декларативного и отражения

Вот урезанная версия моей проблемы:

Учтите, что у меня есть две таблицы: 'procedure' и 'role '.

роль имеет поля: (role_uid, role_name)

процедура имеет поля: (procedure_uid, procedure_name, inform_role_uid, consult_role_uid)

Итак, «роль» имеет два отношения «один ко многим» с «процедурой».

Некоторый код:

class Role(Base):
    __tablename__ = "role"
    __table_args__ = ({'autoload':True, 'useexisting': True})

class Procedure(Base):
    __tablename__ = "procedure"
    __table_args__ = (sqlalchemy.ForeignKeyConstraint(['consult_role_uid','inform_role_uid'],['role.role_uid', 'role.role_uid']),
        {'autoload':True, 'useexisting': True})

Procedure.consult_role = sqlalchemy.orm.relationship(Role,
 primaryjoin="Procedure.consult_role_uid==Role.role_uid", foreign_keys=Role.role_uid)
Procedure.inform_role = sqlalchemy.orm.relationship(Role,
 primaryjoin="Procedure.inform_role_uid==Role.role_uid", foreign_keys=Role.role_uid)

consult_role = sqlalchemy.orm.aliased(Role, name="consult_role")
inform_role = sqlalchemy.orm.aliased(Role, name="inform_role")

query = session.query(
    Procedure.procedure_name, 
    consult_role.role_name.label("consult_role_name"),
    inform_role.role_name.label("inform_role_name")).join(consult_role, inform_role)

Это дает следующий SQL:

SELECT 
  `procedure`.procedure_name AS procedure_procedure_name, 
  consult_role.role_name AS consult_role_name, 
  inform_role.role_name AS inform_role_name 
FROM 
  `procedure` 
  INNER JOIN role AS consult_role 
    ON consult_role.role_uid = `procedure`.consult_role_uid
      AND consult_role.role_uid = `procedure`.inform_role_uid 
  INNER JOIN role AS inform_role 
    ON inform_role.role_uid = `procedure`.consult_role_uid 
      AND inform_role.role_uid = `procedure`.inform_role_uid

Как вы можете видеть, у меня не было намерения, чтобы КАЖДОЕ из внутренних соединений объединялось в обоих полях. Почему мне кажется, что он игнорирует мой аргумент «первичное соединение»?

5
задан Brian Tompsett - 汤莱恩 16 March 2017 в 16:57
поделиться