sqlalchemy 与 and_ 连接的关系不起作用

时间:2021-07-23 10:31:15

标签: python sqlalchemy

使用 sql-alchemy 开发 Python 应用。 有以下两个类:

class Meter(Base):
    __tablename__: str = 'meter'
    __table_args__ = ({'schema': SCHEMA})
    id = Column(BigInteger, primary_key=True, autoincrement=True)
    name = Column(VARCHAR(1024), nullable=True)
    service_id = Column(BigInteger,
                        ForeignKey(Service.id, name='meter_service_id_fk'),
                        nullable=False)

    service = relationship('Service',
                           primaryjoin="and_(Meter.service_id == Service.id, Service.name == 'metering')",
                           lazy='selectin', viewonly=False
                           )

class Service(Base):
    __tablename__: str = 'service'
    __table_args__ = ({'schema': SCHEMA})
    id = Column(BigInteger, primary_key=True, autoincrement=True)
    name = Column(VARCHAR(1024), nullable=True)

所以问题是 primaryjoin="and_(Meter.service_id == Service.id, Service.name == 'metering')" 类中的 Meter 不起作用,它连接到 Service 类中的所有行并忽略 Service.name == 'metering' 条件。 按照说明做in manual

知道我的代码有什么问题吗?谢谢。

1 个答案:

答案 0 :(得分:0)

查询Service时加载Meter表中的行的关系条件中的连接条件。它不限制加载 Meter 中的哪些行。

如果您只想加载那些具有“计量”MeterService,您需要应用一个 WHERE 条件:

# SQLAlchemy 1.x style
meters = session.query(Meter).join(Service).filter(Service.name == 'metering')

# SQLAchemy 1.4 / 2.0 style
meters = session.execute(
         select(Meter).join(Meter.service).where(Service.name == "metering")
)