python - 用于更新表的 SQLAlchemy 自定义约束

标签 python sql postgresql sqlalchemy pyramid

我在使用 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/

相关文章:

ruby-on-rails - 多个 Rails 项目,每个项目都有不同的数据库

Python Flask 用户登录重定向

java - 如何在java中读取使用python的struct.pack方法编写的字符串

python - 如何将多个 Seaborn 绘图保存到单个 pdf 文件中

java - 如何使用 MyBatis 从 SQL 调用存储过程

sql - 在 PostgreSQL 中呈现来自 3 个类似查询的数据

python - 如何更改元组列表的某些值?

sql - 仓库管理经常性计费数据库设计和逻辑

postgresql [42883] 错误 : function to_tsvector ("unknown", "unknown")不存在

java - 如何跳过?在准备好的声明中