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上的方法Command,你的settings.py已经被解析并且你的数据库连接已经被创建。如果您能找到一种方法在运行后使用一组新的数据库设置重新初始化 Django,或者settings.py根据您的启动条件在您的数据库中进行逻辑拆分,如下所示:

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

这可以工作,但非常可怕!

于 2013-03-19T10:12:37.033 回答