postgresql_where中的多个条件

qyzbxkaa  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(183)

postgresql_where对于绕过Postgres定义unique-ness的方式(在我看来是错误的,但显然SQL标准定义了它)很有用,其中Null值总是唯一的。下面显示了一个典型的示例,其中没有项可以具有相同的name+purpose+batch_id值(并且由于第二个索引,None/Null被认为是一个唯一值)。

class Item(StoredObject, Base):
    batch_id = Column(Integer, ForeignKey('batch.id'))
    group_id = Column(Integer, ForeignKey('group.id'))
    name = Column(Text, nullable=False)
    purpose = Column(Text, nullable=False, default="")
    __table_args__ = (
        Index('idx_batch_has_value',
              'group_id', 'name', 'purpose', 'batch_id',
              unique=True,
              postgresql_where=(batch_id.isnot(None))),
        Index('idx_batch_has_no_value',
              'group_id', 'name', 'purpose',
              unique=True,
              postgresql_where=(batch_id.is_(None))),
        )

但是,我希望在两个id(batch_id和group_id)之间具有相同的行为,也就是说,没有任何项目可以具有相同的name+purpose+batch_id+group_id值(None/Null被认为是batch_id和group_id中的唯一值)。
我可以通过创建一个具有固定ID(比如0)的“默认”批处理/组对象来解决这个问题。这意味着我必须确保batch/group对象存在,不能被删除,并且该id不会被另一个“真实的的”batch/group对象重新占用(更不用说我必须记住在使用/编写计算我有多少batch/group的函数时将所有计数减少1)。
我现在就要这么做,但一定有更好的办法!是否有类似的内容:

postgresql_where = (batch_id.isnot(None) AND group_id.isnot(None))

这将解决问题,在我看来,这是要解决的问题,在数据库中,而不是在我的模型和/或初始化代码。

wb1gzix0

wb1gzix01#

from sqlalchemy import and_

postgresql_where=and_(batch_id.isnot(None), group_id.isnot(None))

相关问题