如何使Django管理命令不打开事务?

2024-05-12 22:01:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个管理命令,希望在其中更改默认隔离级别。Django和我的数据库将默认为“READ COMITTED”,我需要它是“READ UNCOMMITTED”,仅对于这个特定的管理命令。在

运行时:

./manage.py my_command

我注意到,即使您的命令不需要任何数据库连接,Django默认情况下都会使用默认隔离级别打开事务:

^{pr2}$

这种行为不符合我的问题,我想问是否有办法:

  • 编写一个管理命令,其中Django甚至不接触数据库,让所有事务控制完全由手动完成?

  • 编写一个管理命令,在这里您只能为它定义事务特征?

问候


Tags: djangopy命令数据库readmanagemy情况
1条回答
网友
1楼 · 发布于 2024-05-12 22:01:59

我在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的普通多数据库语法访问非事务性数据库连接:

^{pr2}$

当然,您可能不希望非事务性数据库连接在整个应用程序中全局可用,因此理想情况下,您希望有一种方法,使其仅在执行此管理命令期间可用。不幸的是,管理命令不是这样工作的:一旦您在Command类上点击了handle方法,您的settings.py已经被解析,并且您的数据库连接已经创建。如果您可以找到一种方法,在运行后使用一组新的数据库设置重新初始化Django,或者根据启动条件在settings.py中进行逻辑拆分,例如:

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

这可能有用,但太可怕了!在

相关问题 更多 >