У меня есть 2 базы данных:
# Config
DATABASES = {
'default': {},
'readonly': {},
}
В фоновой задаче я хотел бы извлечь данные из базы данных «только для чтения», а затем сохранить с использованием базы данных «по умолчанию»:
# Tasks
things = Thing.objects.using('readonly').all()
util.do_stuff_with_things(things) # ideally I don't want to make `using` a required parameter of all my utilities
Я мог бы вручную указать save(using='default')
для всех утилит, но их трудно выследить. Я бы предпочел зафиксировать транзакцию, а затем начать новую транзакцию с подключением по умолчанию.
То, что я пытался:
set_autocommit
transaction.set_autocommit(False, using='readonly')
thing = Thing.objects.using('readonly').first()
transaction.commit(using='readonly')
transaction.set_autocommit(True, using='default')
thing.save() # `save` still requires `using='default'`, "InternalError: cannot execute UPDATE in a read-only transaction"
втянут в
atomic
блок
with transaction.atomic(using='readonly'):
thing = Thing.objects.using('readonly').first()
thing.save() # `save` still requires `using='default'`, "InternalError: cannot execute UPDATE in a read-only transaction"
перезапись
_state.db
Это работает, но мне это не нравится: (
thing = Thing.objects.using('readonly').first()
thing._state.db = 'default'
thing.save()
На данный момент я, вероятно, go с # 3 , поскольку это наименее навязчиво для используемых мною утилит. Но интересно знать, есть ли способ лучше!