2009-10-02 24 views
3

快速SQLAlchemy的问题...复合的UniqueConstraint与函数

我有一个类“文档”与属性“数字”和“日期”。我需要确保没有重复编号在同一年,是 有一种方法来在“数+年(日期)”UniqueConstraint?我应该使用唯一的索引吗?我将如何声明功能部分?

(SQLAlchemy的0.5.5,8.3.4的PostgreSQL)

提前感谢!

回答

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' 
      ) 
     ) 
+0

它工作的很好,非常感谢:) – Joril 2009-10-05 09:30:25

+0

注意:'%(fullname)s'从表格中的信息填充到SQLAlchemy中,这里是'ModelObject .__ table__'。 – 2013-03-23 20:57:06

0

我敢肯定,唯一约束只能应用于已经有数据的列,而不是运行时计算的表达式。因此,您需要创建一个额外的列,其中包含您的dateyear部分,您可以通过该列创建与number一起的唯一约束。为了最好地使用这种方法,也许你应该把你的date拆分成三个单独的列,其中包含日期,月份和年份。这可以使用表定义中的默认约束来完成。

+0

我明白了。所以也许我应该去寻找一个唯一的索引而不是约束..我会更新这个问题,谢谢你的输入! – Joril 2009-10-02 15:48:45