6

デフォルトの分離レベルを変更したい管理コマンドを書いています。Djangoと私のデータベースはデフォルトで「READ COMITTED」に設定されていますが、この特定の管理コマンドに対してのみ「READ UNCOMMITTED」にする必要があります。

実行時:

./manage.py my_command

コマンドがデータベース接続を必要としない場合でも、Django はデフォルトでデフォルトの分離レベルでトランザクションを開くことに気付きました。

from django.core.management.base import BaseCommand

class Command(BaseCommand):
    help = "Updates assortment data by refreshing the mviews"

    def handle(self, *args, **options):
        print "fdkgjldfkjgdlkfjgklj"

この動作は私の問題に合わないので、次の方法があるかどうか尋ねています。

  • すべてのトランザクション制御を完全に手動のままにして、Django がデータベースに触れることさえしない管理コマンドを作成しますか?

  • そのためだけにトランザクション特性を定義できる管理コマンドを作成しますか?

よろしく

4

1 に答える 1

5

Facebookであなたの投稿に出くわし、助けになるかもしれないと思いました:-)

次のデータベース設定を使用して、読み取りがコミットされていないデータベース接続を指定できますsettings.py

DATABASES: {
    'default': {...}
    'uncommitted_db': {
        'ENGINE': ...
        'NAME': ...
        'USER': '...',
        'PASSWORD': '...',
        'HOST': '...', 
        'OPTIONS': {
            'init_command': 'SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'  #MySQL
            'init_command': 'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED' #Postgres
        }
    }
}

これが適切な場所にあると、Djangoの通常のマルチデータベース構文を使用して非トランザクションデータベース接続にアクセスできます。

Model.objects.using('uncommitted_db').all()

もちろん、非トランザクションデータベース接続をアプリケーション全体でグローバルに使用できるようにしたくない場合もあるため、理想的には、この管理コマンドの実行中にのみ使用できるようにする方法が必要です。残念ながら、管理コマンドはそのようには機能しません。クラスでhandleメソッドをヒットすると、はすでに解析され、データベース接続はすでに作成されています。実行後に新しいデータベース設定のセットを使用してDjangoを再初期化する方法、または起動条件に基づいて論理的に分割する方法を見つけることができる場合は、次のようになります。Commandsettings.pysettings.py

import sys
if 'some_management_cmd' in sys.argv: 
    DATABASES['default']['OPTIONS']['init_command'] = 'SET TRANSACTION...'

これはうまくいくかもしれませんが、かなりひどいです!

于 2013-03-19T10:12:37.033 に答える