Django + mysqlclient没有关闭数据库连接

时间:2015-07-18 14:50:31

标签: python mysql django

我正在使用2个mysql数据库连接。在django中的每个页面请求之后,连接计数(由SHOW STATUS LIKE 'Conn%'显示每次增加2。

Python 3.4.0
django 1.8.2
mysqlclient 1.3.6

(Windows和Linux似乎都有问题)

最初我直接通过MySQLdb访问了第二个数据库,但现在我已经切换到使用django.db.connections['...']来访问它了。

这是我的settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myapp',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    },
    'analytics': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myapp_analytics',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    },
}

这些是我为了方便使用而编写的类:

import MySQLdb as DBConnector
import django
class DictCursorEmulator:
    def __init__(self, connection):
        self.cursor = connection.cursor()

    def _execute(self,query_str,query_args):
        self.cursor.execute(query_str,query_args)

    def fetchall(self):
        "Returns all rows from a cursor as a dict"
        desc = self.cursor.description
        return [
            dict(zip([col[0] for col in desc], row))
            for row in self.cursor.fetchall()
        ]

    def fetchone(self):
        desc = self.cursor.description
        return dict(zip([col[0] for col in desc], row))


#I probably should have used instance methods here but there's too much code to update ;_;
class DatabaseInterface:
    @classmethod
    def execute(self, queryStr, args):
        cursor = DictCursorEmulator(django.db.connections['analytics'])
        cursor._execute(queryStr,args)
        return cursor

    @classmethod
    def autocommit(cls, set_to):
        django.db.connections['analytics'].autocommit(set_to)


    @classmethod
    def commit(cls):
        django.db.connections['analytics'].commit()

    @classmethod
    def rollback(cls):
        django.db.connections['analytics'].rollback()

我已经尝试排除整个文件,但它仍然使连接数增加2,所以我开始认为这不是我的代码的问题。有谁知道如何解决这个问题?

更新:显然,Connections显示了连接总数 连接的线程显示2,这是预期的。这解决了我的问题。我刚刚在数据库端出现了很多奇怪的错误。

0 个答案:

没有答案