sqlalchemy - 在outerjoins的ON子句中添加任意条件

时间:2013-10-17 22:46:03

标签: python join sqlalchemy conditional-statements

我是sqlalchemy的新手。

我试图在外连接的ON子句中添加一些任意子句,而不必重写我的连接条件。

举个例子,让我们得到2个表:

class adm_funcionario(Base):
    __tablename__ = "adm_funcionario"
    idFuncionario = Column(Integer, nullable=False, primary_key=True, autoincrement=True)
    nome = Column(VARCHAR(45), nullable=False)
    foto = Column(BLOB)
    apelido = Column(VARCHAR(32), default='')


class adm_funcionario_acesso(Base):
    __tablename__ = "adm_funcionario_acesso"
    idFuncionario = Column(Integer, ForeignKey('adm_funcionario.idFuncionario'), nullable=False, primary_key=True)
    dataHora = Column(DATETIME, nullable=False, primary_key=True)
    estacao = Column(VARCHAR(45), nullable=False)
    idSessaoDB = Column(Integer, nullable=False)

如果我这样做:

qr = session.query(adm_funcionario).outerjoin(adm_funcionario_acesso)
print(qr)

它按预期返回第二个表中的ON子句。但是,如何在第二个表中添加另一个过滤器?

我尝试使用filter子句,但它将新条件放在where中,而不是放在ON子句中。

我到目前为止找到的唯一解决方案是完全重写条件(sqlalchemy知道如何进行连接,我想在这个特定的表中增加一个新条件):

qr = session.query(adm_funcionario)
qr = qr.outerjoin(adm_funcionario_acesso, and_(adm_funcionario_acesso.idFuncionario==adm_funcionario.idFuncionario, adm_funcionario_acesso.idSessaoDB > 4))

如果没有完全重写ON子句,有没有办法做到这一点?

由于

1 个答案:

答案 0 :(得分:0)

我不确定"我想在这个特定的表格中增加一个新条件"实际意味着。我想你的意思是:

class adm_funcionario(Base):
    __tablename__ = "adm_funcionario"
    idFuncionario = Column(Integer, nullable=False, primary_key=True, autoincrement=True)
    nome = Column(VARCHAR(45), nullable=False)
    foto = Column(BLOB)
    apelido = Column(VARCHAR(32), default='')


class adm_funcionario_acesso(Base):
    __tablename__ = "adm_funcionario_acesso"
    idFuncionario = Column(Integer, ForeignKey('adm_funcionario.idFuncionario'), nullable=False, primary_key=True)
    dataHora = Column(DATETIME, nullable=False, primary_key=True)
    estacao = Column(VARCHAR(45), nullable=False)
    idSessaoDB = Column(Integer, nullable=False)
    # conditional relationship (give it a meaningful name)
    named_relation = relationship(adm_funcionario, primaryjoin='and_(adm_funcionario_acesso.idFuncionario==adm_funcionario.idFuncionario, adm_funcionario_acesso.idSessaoDB > 4)')


qr = session.query(adm_funcionario).outerjoin(adm_funcionario_acesso.named_relation)
print(qr)

您应该更改" named_relation"有意义的事情。您可以在同一个表上拥有多个关系。此外,如果您只加入模型,您将无法获得'和_(..)'条款。我可以想到一些其他的解决方案,比如子查询,但这取决于你真正需要什么。此外,如果您在类定义之外建立关系,则不需要将其放在字符串中。

adm_funcionario_acesso.named_relation = relationship(adm_funcionario, primaryjoin=and_(adm_funcionario_acesso.idFuncionario==adm_funcionario.idFuncionario, adm_funcionario_acesso.idSessaoDB > 4))