2013-10-17 23 views
3

我在sqlalchemy中很新。sqlalchemy - 在外部鏈接的ON子句中添加任意條件

我試圖在一個外連接的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子句中。

我發現到現在唯一的解決辦法是重寫條件completelly(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

我不知道什麼是「我想只是增加一個新的狀態在這個特定表」的實際含義。我認爲你的意思是:

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))