快速SQLAlchemy的问题...复合的UniqueConstraint与函数
我有一个类“文档”与属性“数字”和“日期”。我需要确保没有重复编号在同一年,是 有一种方法来在“数+年(日期)”UniqueConstraint?我应该使用唯一的索引吗?我将如何声明功能部分?
(SQLAlchemy的0.5.5,8.3.4的PostgreSQL)
提前感谢!
快速SQLAlchemy的问题...复合的UniqueConstraint与函数
我有一个类“文档”与属性“数字”和“日期”。我需要确保没有重复编号在同一年,是 有一种方法来在“数+年(日期)”UniqueConstraint?我应该使用唯一的索引吗?我将如何声明功能部分?
(SQLAlchemy的0.5.5,8.3.4的PostgreSQL)
提前感谢!
您应该使用功能唯一索引来应用此约束。不幸的是,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'
)
)
我敢肯定,唯一约束只能应用于已经有数据的列,而不是运行时计算的表达式。因此,您需要创建一个额外的列,其中包含您的date
的year
部分,您可以通过该列创建与number
一起的唯一约束。为了最好地使用这种方法,也许你应该把你的date
拆分成三个单独的列,其中包含日期,月份和年份。这可以使用表定义中的默认约束来完成。
我明白了。所以也许我应该去寻找一个唯一的索引而不是约束..我会更新这个问题,谢谢你的输入! – Joril 2009-10-02 15:48:45
它工作的很好,非常感谢:) – Joril 2009-10-05 09:30:25
注意:'%(fullname)s'从表格中的信息填充到SQLAlchemy中,这里是'ModelObject .__ table__'。 – 2013-03-23 20:57:06