Django多数据库&x2014;读自;只读“;联系;提交事务,并让以下所有查询使用;“违约”;连接
我有两个数据库:Django多数据库&x2014;读自;只读“;联系;提交事务,并让以下所有查询使用;“违约”;连接,django,transactions,django-queryset,multiple-databases,Django,Transactions,Django Queryset,Multiple Databases,我有两个数据库: #配置 数据库={ 'default':{}, “只读”:{}, } 在后台任务中,我想从“只读”数据库中提取数据,然后使用“默认”数据库保存: #任务 things=Thing.objects.using('readonly').all() util.do_stuff_with_things(things)#理想情况下,我不想将`using`作为我所有实用程序的必需参数 我可以在所有实用程序上手动指定save(使用class='default'),但很难找到它们。我宁愿提
#配置
数据库={
'default':{},
“只读”:{},
}
在后台任务中,我想从“只读”数据库中提取数据,然后使用“默认”数据库保存:
#任务
things=Thing.objects.using('readonly').all()
util.do_stuff_with_things(things)#理想情况下,我不想将`using`作为我所有实用程序的必需参数
我可以在所有实用程序上手动指定save(使用class='default')
,但很难找到它们。我宁愿提交事务,然后在默认连接上启动新事务
我所尝试的:
设置自动提交
transaction.set\u autocommit(False,使用='readonly')
thing=thing.objects.using('readonly').first()
commit(使用='readonly')
transaction.set_autocommit(True,使用='default')
thing.save()#`save`仍然需要`using='default'`,“InternalError:无法在只读事务中执行更新”
原子块
(使用='readonly'):
thing=thing.objects.using('readonly').first()
thing.save()#`save`仍然需要`using='default'`,“InternalError:无法在只读事务中执行更新”
\u state.db
thing=thing.objects.using('readonly').first()
东西。_state.db='default'
保存
现在,我可能会选择#3,因为它对我正在使用的实用程序的干扰最小。但我想知道是否有更好的方法!谢谢@arakkal abu,我一直在寻找数据库路由器
BGTaskDatabaseRouter类:
def db_用于_读取(自身、型号、**提示):
返回“只读”
def db_用于_写入(自身、型号、**提示):
返回“默认值”
在我的设置文件中:
数据库_路由器=[]
如果是背景任务:
DATABASE_ROUTERS.append('DATABASE_ROUTERS.BGTaskDatabaseRouter'
可能是这个?