"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がデフォルト値に対処していないので、マイケルバイエルは、この動作が予想されていることを教えてくれました。
ありがとうございました。そこに呼び出し可能なコールを使用することができませんでした。私はすぐにそれを試してみます:) – Joril
デフォルトの呼び出し可能関数は、DBの列の最大値と1を返します。独自の列からのエラーに頼ることなく競合条件が存在しないと主張する方法はありますか? –
その場合、インラインSQL式としてデフォルトを書く方がよいでしょう。これはSQLAlchemyのドキュメント(http://www.sqlalchemy.org/docs/05/metadata.html#pre-executed-and-inline-sql-expressions)で詳細に説明されています –