我在使用 PostgreSQL 的 Pyramid Web 应用程序中遇到 SQLAlchemy 约束问题。
我有一个可以处于不同状态的对象:
class Foo(Base):
# -1 - inactive
# 0 - in queue
# 1 - next
# 2 - active
state = Column(
Integer,
nullable=False
)
现在我希望始终只有一个(或没有)对象处于事件状态,只有一个(或没有)对象处于下一状态,并且对于有多少对象处于其他两种状态应该没有限制。
我想创建一个约束或充当约束的东西,如果已经有一个对象处于该状态(下一个状态相同),则不允许将任何其他对象的状态更改为事件状态。
唯一约束在这里不起作用,因为我只希望某些值是唯一的,而不是全部。 基本上我想要的是,每当我提交事务时,如果它会破坏我所写的约束,则有一种机制不允许提交事务。 我怎样才能做到这一点?
最佳答案
PostgreSQL 通过部分唯一索引支持此功能。
CREATE UNIQUE INDEX foo_only_one_active ON foo(state) WHERE (state = 'active');
CREATE UNIQUE INDEX foo_only_one_active ON foo(state) WHERE (state = 'next');
将限制表,使得只有一行可以具有状态“事件”或“下一页”。如果您愿意,您可以使用带有 state IN ('active', 'next')
的单个索引,但我认为这种形式更有可能实际用于 state = ' 的查询中事件'
或 state = '下一个
'。
关于python - 用于更新表的 SQLAlchemy 自定义约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22106106/