SQLAlchemyのカスタムロジックを使用した自動インクリメント属性
-
10-07-2019 - |
質問
シンプルな「請求書」があります" Number"を持つクラスしなければならない属性 ユーザーが請求書を保存するときにアプリケーションによって割り当てられます。そこ いくつかの制約があります:
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
今の私の問題は、請求書とAutoIncrementを保存すると " 1"を設定しますその番号の値として、請求書インスタンスは取得しません 新しい番号で更新されました。これは予想されますか?行方不明です 何か? お時間をいただきありがとうございます!
(Python 2.6のSQLA 0.5.3、postgreSQL 8.3を使用)
編集: Michael Bayerは、TypeDecoratorsはデフォルト値を処理しないため、この動作が予想されることを教えてくれました。
解決
列定義で 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)
...
所属していません StackOverflow