无法填充自我渴望加载的关系

时间:2012-05-21 09:38:20

标签: python sqlalchemy

我正在尝试使用contains_eager选项急切地加载一个自我关系属性,以避免在使用关系列之一进行排序或搜索时出现两个连接。我的模型对象看起来像:

class Usuario(DeclarativeBase):
    __tablename__ = 'usuarios'
    __table_args__ = {'mysql_engine':'InnoDB'}

    id=Column(Integer, primary_key=True)
    usuario=Column(Text) 
    ...
    resellers_id=Column(Integer, ForeignKey('usuarios.id')) 
    ....
    reseller = relation('Usuario', remote_side = [id])

我用来获取数据:

u= DBSession.query(Usuario).options(contains_eager('reseller'))\
            .outerjoin(self.usuarios_padre, Usuario.resellers_id == self.usuarios_padre.id)\
            .filter(Usuario.id=1)\
            .order_by(self.usuarios_padre.usuario).one()

其中 self.usuarios_padre 是Usuario的别名

如果我访问 u.reseller.usuario ,我会与 u.usuario 相同,而不是从父母那里获取usuario

知道问题出在哪里?我试图使用lazy =“joined”来定义关系而没有结果。

此致

1 个答案:

答案 0 :(得分:1)

问题是您在一个查询中加载了两组Usuario个对象,为了解决问题,您需要使用aliased然后明确地joincontains_eager中指定别名

qry = session.query(Usuario).filter(Usuario.id==1)

# join using the aliased. Use *outerjoin* in order to still get the result for those without a parent
res = aliased(Usuario)
qry = qry.outerjoin((res, Usuario.reseller))

# specify which table/alias represents the *contained* relationship
qry = qry.options(contains_eager(Usuario.reseller, alias=res))