2012-02-08 1 views
3

Djangoには@transaction.commit_manuallyというデコレータ機能があります。このデコレータにパラメータを渡そうとしています。(using=db)dbは、ビジネスルールに基づいて、使用されているデータベースによって異なります。現在のデータベースをこのデコレータに渡す最善の方法は何ですか?私は内部関数を使用しようとしました:動的データベース名をデコレータに渡すにはどうすればよいですか?

しかし、これは失敗します。 pdbで発見したエラーは、内部ブロックが「トランザクション管理下にありません」ということです。どうすればこの問題を解決できますか? pdbから

トレースバック:

-> success = transactional_registration() 
    /usr/local/lib/python2.7/dist-packages/django/db/transaction.py(338)_commit_manually() 
-> return func(*args, **kw) 
> /home/syrion/dev/registration.py(59)transactional_registration() 
-> transaction.rollback() 
    /usr/local/lib/python2.7/dist-packages/django/db/transaction.py(210)rollback() 
-> set_clean(using=using) 
    /usr/local/lib/python2.7/dist-packages/django/db/transaction.py(125)set_clean() 
-> raise TransactionManagementError("This code isn't under transaction management" 

編集:私は私自身の問題を修正しました。内部関数の解法は正しく機能しますが、rollback()commit()をusingパラメータ(transaction.commit(using=db))と呼ぶ必要がありました。私は直感的ではないと思っていますが...

+0

transaction.rollback()の後にraiseを追加して、stacktrace + fullエラーを投稿できますか? –

+0

なぜあなたはこれをとても複雑にしていますか? 'func'が呼び出し可能なオブジェクトでないのはなぜですか? –

+0

'func'はオブジェクト上で呼び出し可能なメソッドです。 'func'自体を飾ると、データベースは範囲外です。 – syrion

答えて

1

私はORMに多くのストレスをかけるので、これは私のコードでかなり頻繁に使用します。私はデコレータシンタックスの大ファンではないので、私はwithステートメントを使用します。

これは動作するはずです。あなたがあなたのtransaction.rollback()(using=db)を必要とするかどうか確信しています。あなたはそれについての研究をすることができると確信しています。しかし(using=db)transaction.commit(using=db)に必要です。

関連する問題