postgresql_where
有助于解决(在我看来错误,但显然是SQL标准定义它)Postgres定义唯一性的方式,其中Null值始终是唯一的。下面显示了一个典型示例,其中没有项目可以具有相同的名称+目的+ batch_id值(由于第二个索引,无/ 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)具有相同的行为,也就是说没有任何项可以具有相同的名称+目的+ batch_id + group_id值(无/ Null在batch_id和batch中都被视为一个唯一值GROUP_ID)。
我可以通过创建具有固定ID(例如0)的“默认”批处理/组对象来解决此问题。这意味着我必须确保批处理/组对象存在,无法删除,并且该ID不会被重新用于另一个“真正的”批处理/组对象(更不用说我必须记住当使用/写入计算我有多少批次/组的函数时,将所有计数减少一个。
可行,我现在要做,但必须有更好的方法!是否有类似的东西: -
postgresql_where = (batch_id.isnot(None) AND group_id.isnot(None))
这将解决我认为在数据库中而不是在我的模型和/或初始化代码中要解决的问题。