2009-06-24 8 views
1

"Number"属性を持つ単純な "請求書"クラスがあり、ユーザーが請求書を保存するときにアプリケーションによって割り当てられる があります。 は、いくつかの制約があります。SQLAlchemyのカスタムロジックを使用した自動インクリメント属性

1)アプリケーションは、(シン)クライアント - サーバー1であるので、どんな は数が衝突
2の外を見る必要があります割り当て)請求書あまりにも「バージョン」属性を持っているので、I 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」を保存するときにということですはありません を新しい番号で更新します..これは期待されますか?私は逃した 何か? お時間をありがとう! (postgreSQLの8.3を使ってPython 2.6にSQLA 0.5.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

ありがとうございました。そこに呼び出し可能なコールを使用することができませんでした。私はすぐにそれを試してみます:) – Joril

+0

デフォルトの呼び出し可能関数は、DBの列の最大値と1を返します。独自の列からのエラーに頼ることなく競合条件が存在しないと主張する方法はありますか? –

+0

その場合、インラインSQL式としてデフォルトを書く方がよいでしょう。これはSQLAlchemyのドキュメント(http://www.sqlalchemy.org/docs/05/metadata.html#pre-executed-and-inline-sql-expressions)で詳細に説明されています –

関連する問題