2009-10-02 26 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