我是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子句,有没有办法做到这一点?
由于
答案 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))