具有函数的复合UniqueConstraint

时间:2009-10-02 14:52:57

标签: python sqlalchemy constraints

一个快速的SQLAlchemy问题......

我有一个“文档”类,其属性为“数字”和“日期”。我需要确保同一年没有重复的数字,是 有没有办法在“数字+年(日期)”上有一个UniqueConstraint?我应该使用唯一的索引吗?我如何申报功能部分?

(SQLAlchemy 0.5.5,PostgreSQL 8.3.4)

提前致谢!

2 个答案:

答案 0 :(得分:3)

您应该使用功能唯一索引来应用此约束。遗憾的是,SQLAlchemy中的数据库通用数据库独立模式定义机制尚未抽象功能索引。您必须使用DDL构造来注册自定义架构定义子句。如果使用声明性方法声明架构,请在类定义后添加以下内容:

DDL(
    "CREATE UNIQUE INDEX doc_year_num_uniq ON %(fullname)s "
    "(EXTRACT(YEAR FROM date), number)"
).execute_at('after-create', Document.__table__)

此方法非常有效,但在v0.7中抛出了SADeprecation警告 我成功使用的语法:

from sqlalchemy import event

event.listen(ModelObject.__table__,
         'after_create',
          DDL("CREATE UNIQUE INDEX term_year ON %(fullname)s "
              "(EXTRACT(YEAR FROM start_date), term)",
              on = 'postgresql'
              )
         )

答案 1 :(得分:0)

我很确定唯一约束只能应用于已经包含数据的列,而不能应用于运行时计算的表达式。因此,您需要创建一个额外的列,其中包含year的{​​{1}}部分,您可以在其上创建唯一约束以及date。为了最好地使用这种方法,您可以将number拆分存储在包含日,月和年部分的三个单独列中。这可以使用表定义中的默认约束来完成。