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))
这将解决问题,在我看来,这是要解决的问题,在数据库中,而不是在我的模型和/或初始化代码。
1条答案
按热度按时间wb1gzix01#