快速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