3

我是 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 子句的情况下做到这一点?

谢谢

4

1 回答 1

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”更改为有意义的东西。您可以在同一张表上拥有多个关系。此外,如果您只加入模型,您将不会获得“and_(..)”子句。我可以想到其他一些解决方案,例如子查询,但这取决于您真正需要什么。此外,如果您在类定义之外建立关系,则无需将其放在字符串中。

adm_funcionario_acesso.named_relation = relationship(adm_funcionario, primaryjoin=and_(adm_funcionario_acesso.idFuncionario==adm_funcionario.idFuncionario, adm_funcionario_acesso.idSessaoDB > 4))
于 2014-05-08T14:34:26.937 回答