Мне нужно создать новое соединение (сеанс) с базой данных, чтобы избежать неожиданной фиксации процедуры MySql в моей транзакции django. Как настроить в джанго?
Я попытался продублировать конфигурацию базы данных в файле настроек. Это сработало для меня, но кажется не очень хорошим решением. Смотрите мой код для более подробной информации.
@classmethod
def get_sequence_no(cls, name='', enable_transaction=False):
"""
return the sequence no for the given key name
"""
if enable_transaction:
valobj = cls.objects.using('sequence_no').raw("call sp_get_next_id('%s')" % name)
return valobj[0].current_val
else:
valobj = cls.objects.raw("call sp_get_next_id('%s')" % name)
return valobj[0].current_val
Кто-нибудь знает, как использовать пользовательское соединение с базой данных для вызова процедуры?
Если вы посмотрите на модуль django.db
, вы увидите, что django.db.connection
— это прокси для django.db.connections[DEFAULT_DB_ALIAS]
, а django.db.connections
— экземпляр django.db.utils.ConnectionHandler
.
Собрав это вместе, вы сможете получить новое соединение, подобное этому:
from django.db import connections
from django.db.utils import DEFAULT_DB_ALIAS, load_backend
def create_connection(alias=DEFAULT_DB_ALIAS):
connections.ensure_defaults(alias)
connections.prepare_test_settings(alias)
db = connections.databases[alias]
backend = load_backend(db['ENGINE'])
return backend.DatabaseWrapper(db, alias)
Обратите внимание, что эта функция будет открывать новое соединение при каждом вызове, и вы несете ответственность за его закрытие. Кроме того, API-интерфейсы, которые он использует, вероятно, считаются внутренними и могут быть изменены без предварительного уведомления.
Чтобы закрыть соединение, достаточно вызвать .close()
на объекте, возвращаемом функцией create_connection
:
conn = create_connection()
# do some stuff
conn.close()
@MichealJ.Roberts Я расширил свой ответ
Ах, идеально! :) Так просто, очень ценю, что вы потратили время, чтобы расширить это.
Привет @Daniel, просто интересно, есть ли где-нибудь фрагмент для закрытия такого соединения? Должны ли мы переключить соединение обратно на значение по умолчанию после использования этого?