2009-06-24 109 views
1

我有一個簡單的「發票」類,具有必須由應用程序在用戶保存發票時分配的「數量」屬性 。有 一些制約因素:在SQLAlchemy中使用自定義邏輯自動遞增屬性

1)應用程序是(瘦)客戶端 - 服務器之一,所以無論 分配數量必須尋找出碰撞
2)發票有一個「版本」屬性也一樣,所以我不能使用一個簡單的 DBMS級別的自動增量字段

我試圖建立這個使用自定義類型,它會在發票得到保存每個 時間踢。每當process_bind_param被調用 一個None值時,它將調用某種類型的單例來確定 號碼並避免衝突。這是一個體面的解決方案? 無論如何,我有一個問題..這裏是我的自定義類型:

class AutoIncrement(types.TypeDecorator): 
    impl = types.Unicode 

    def copy(self): 
     return AutoIncrement() 

    def process_bind_param(self, value, dialect): 
     if not value: 
      # Must find next autoincrement value 
      value = "1" # Test value :) 
     return value 

我的問題現在的問題是,當我保存發票和自動增加 設定爲「1」的價值它的編號,發票實例不會得到 用新的數字更新..這是預期的嗎?我是否缺少 的東西? 非常感謝您的時間!

(SQLA 0.5.3關於Python 2.6,使用PostgreSQL 8.3)

編輯:邁克爾·拜爾告訴我,這是正常現象,因爲TypeDecorators不使用默認值處理。

回答

3

是否有任何特定的原因,您不只是在列定義中使用default=參數? (這可以是任意Python可調用的)。

def generate_invoice_number(): 
    # special logic to generate a unique invoice number 

class Invoice(DeclarativeBase): 
    __tablename__ = 'invoice' 
    number = Column(Integer, unique=True, default=generate_invoice_number) 
    ... 
+0

哎喲不知道你可以在那裏使用callable,謝謝!我會馬上試試:) – Joril 2009-06-24 12:57:27