3

私はsqlalchemyで非常に新しいです。

結合条件を書き直すことなく、outerjoin の 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)

期待どおり、2 番目のテーブルに ON 句が返されます。しかし、どうすれば 2 番目のテーブルに別のフィルターを配置できますか?

句を使用しようとしましfilterたが、新しい条件がwherein 句ではなく に配置され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 に答える