Co *_*ker 3 python mysql django transactions
我需要创建一个新的数据库连接(会话)以避免在我的 Django 事务中来自 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
Run Code Online (Sandbox Code Playgroud)
有谁知道如何使用自定义数据库连接来调用该过程?
如果您查看该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)
Run Code Online (Sandbox Code Playgroud)
请注意,此函数每次调用时都会打开一个新连接,您负责关闭它。此外,它使用的 API 可能被认为是内部的,可能会在不通知的情况下发生变化。
要关闭连接,调用函数.close()返回的对象就足够了create_connection:
conn = create_connection()
# do some stuff
conn.close()
Run Code Online (Sandbox Code Playgroud)