1

ユーザーが請求書を保存するときにアプリケーションによって割り当てられる必要がある「番号」属性を持つ単純な「請求書」クラスがあります。いくつかの制約があります:

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

私の問題は、Invoice を保存し、AutoIncrement がその番号の値として「1」を設定すると、Invoice インスタンスが新しい番号で更新されないことです..これは予想どおりですか? 何か不足していますか?お時間をいただきありがとうございました!

(Python 2.6 上の SQLA 0.5.3、postgreSQL 8.3 を使用)

編集: TypeDecorators はデフォルト値を扱わないため、Michael Bayer は、この動作は予期されていると私に言いました。

4

1 に答える 1

6

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)
    ...
于 2009-06-24T12:47:25.807 に答える