如何在 Django 中创建新的数据库连接

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)

有谁知道如何使用自定义数据库连接来调用该过程?

Dan*_*per 7

如果您查看该django.db模块,您会发现它django.db.connection是 的代理django.db.connections[DEFAULT_DB_ALIAS]并且django.db.connectionsdjango.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)