一个快速的SQLAlchemy问题......
我有一个“文档”类,其属性为“数字”和“日期”。我需要确保同一年没有重复的数字,是 有没有办法在“数字+年(日期)”上有一个UniqueConstraint?我应该使用唯一的索引吗?我如何申报功能部分?
(SQLAlchemy 0.5.5,PostgreSQL 8.3.4)
提前致谢!
答案 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
拆分存储在包含日,月和年部分的三个单独列中。这可以使用表定义中的默认约束来完成。