使用 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。
知道我的代码有什么问题吗?谢谢。
答案 0 :(得分:0)
查询Service
时加载Meter
表中的行的关系条件中的连接条件。它不限制加载 Meter
中的哪些行。
如果您只想加载那些具有“计量”Meter
的 Service
,您需要应用一个 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")
)