postgresql_where中的多个条件?

时间:2018-04-20 04:26:53

标签: postgresql sqlalchemy pyramid

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))

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

0 个答案:

没有答案