【问题标题】:SQLAlchemy custom constraint for updating table用于更新表的 SQLAlchemy 自定义约束
【发布时间】:2014-04-02 02:25:48
【问题描述】:

我在使用 PostgreSQL 的 Pyramid Web 应用程序中遇到了 SQLAlchemy 的约束问题。

我有一个可以处于不同状态的对象:

class Foo(Base):

    # -1 - inactive
    # 0 - in queue
    # 1 - next
    # 2 - active
    state = Column(
        Integer,
        nullable=False
    )

现在我希望始终只有一个(或没有)对象处于活动状态,只有一个(或没有)对象处于下一个状态,并且对于其他两种状态的对象数量应该没有限制。

如果已经有一个处于该状态的对象(对于下一个状态也是如此),我想创建一个约束或作为约束的东西,它不允许将任何其他对象的状态更改为活动状态。

唯一约束在这里不起作用,因为我只希望某些值是唯一的,而不是全部。 基本上我想要的是,每当我提交事务时,如果它会破坏我所写的约束,则有一种机制不允许事务被提交。 我怎样才能做到这一点?

【问题讨论】:

  • 是的,当然。我基本上有一个当前正在进行的任务和一个始终处于就绪状态的任务(下一个)。当任务处于活动状态时,不同的用户可以将其从活动中移除,将下一个任务置于活动状态,将新任务置于就绪状态。如果多个用户同时执行此操作,则会出现问题,这就是为什么我需要这样的约束。

标签: python sql postgresql sqlalchemy pyramid


【解决方案1】:

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 = 'active'state = 'next'。

【讨论】:

  • 谢谢!这似乎可以解决问题!我只关注 SQLAlchemy 基础解决方案,并没有深入研究 PostgreSQL 部分:)
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 2016-12-05
  • 2018-12-04
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多