Django使用DBUtils.PooledDB作为数据库连接池

安装:

pip install django-pooldb

项目地址:

https://github.com/liangalien/django-pooldb

原文:


一、首先肯定要安装相应的模块的:

pip install pymysql
pip install DBUtils

 二、在Django项目新建一个包(目录),这里直接建一个包:backends.mysql

三、mysql新建一个py文件,作为Django数据库引擎,名字好像必须用base.py

base.py内容如下:

#coding: utf-8
#author: Alien
#date  : 2021年3月31日

import pymysql
from django.db.backends.mysql.base import DatabaseWrapper as MySQLDatabaseWrapper
from DBUtils.PooledDB import PooledDB

_pool = None

class DatabaseWrapper(MySQLDatabaseWrapper):
    def _set_autocommit(self, autocommit):
        '''重写父类方法为空方法,因为PooledDB的conn没有autocommit属性,不重写就会报错
        '''
        pass
    
    def get_new_connection(self, conn_params):
        '''获取连接
        '''
        
        global _pool
        if not _pool:  # 未开辟连接池,仅启动的时候开辟一次
            conn_params['creator'] = pymysql
            _pool = PooledDB(**conn_params)
            print('创建数据库连接池成功')
        
        # 从连接池获取连接
        return _pool.connection()

四、在settings.py,修改数据库引擎包

DATABASES = {
    'default': { 
        'ENGINE': 'backends.mysql', #这里就是你新建的包路径
        'NAME': DB_NAME,
        'HOST': DB_HOST,
        'PORT': DB_PORT,
        'USER': DB_USER, 
        'PASSWORD': DB_PASSWD,
        
        'OPTIONS': { #这里可以填写一些PooledDB的参数
            'maxconnections': 100, 
            'autocommit': True
        },
    }
}

五、启动,就可以直接使用连接池了

六、补充:多数据源连接池

修改base.py内容为下述内容:

#coding: utf-8
#author: Alien
#date  : 2021年3月31日

import pymysql
from django.db.backends.mysql.base import DatabaseWrapper as MySQLDatabaseWrapper
from DBUtils.PooledDB import PooledDB

_pools = {}

class DatabaseWrapper(MySQLDatabaseWrapper):
    def _set_autocommit(self, autocommit):
        '''重写父类方法为空方法,因为PooledDB的conn没有autocommit属性,不重写就会报错
        '''
        pass
    
    def get_new_connection(self, conn_params):
        '''获取连接
        '''
        
        global _pool
        if not _pools.get(self.alias):
            conn_params['creator'] = pymysql
            _pools[self.alias] = PooledDB(**conn_params)
            print('创建数据库连接池成功: %s' % self.alias)
        
        return _pools.get(self.alias).connection()

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'library.db.backends.mysql',
        'NAME': DB_NAME,
        'HOST': DB_HOST,
        'PORT': DB_PORT,
        'USER': DB_USER,
        'PASSWORD': DB_PASSWD,

        'OPTIONS': {
            'init_command': 'SET foreign_key_checks = 0;', #禁用外键约束
            'maxconnections': 100,
            'autocommit': True
        },
    },
    'default2': {
        'ENGINE': 'library.db.backends.mysql',
        'NAME': DB_NAME2,
        'HOST': DB_HOST2,
        'PORT': DB_PORT2,
        'USER': DB_USER2,
        'PASSWORD': DB_PASSWD2,

        'OPTIONS': {
            'init_command': 'SET foreign_key_checks = 0;', #禁用外键约束
            'maxconnections': 100,
            'autocommit': True
        },
    },
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值