Flask--数据库连接池

匿名 (未验证) 提交于 2019-12-03 00:16:01

Ŀ¼

import pymysql  conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='s8day127db') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # cursor.execute("select id,name from users where name=%s and pwd=%s",['lqz','123',]) cursor.execute("select id,name from users where name=%(user)s and pwd=%(pwd)s",{'user':'lqz','pwd':'123'}) obj = cursor.fetchone() conn.commit() cursor.close() conn.close()  print(obj)

为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,连接自动关闭

from DBUtils.PersistentDB import PersistentDB import pymysql POOL = PersistentDB(     creator=pymysql,  # 使用链接数据库的模块     maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制     setsession=[],  # 开始会话前执行的命令列表。     ping=0,     # ping MySQL服务端,检查是否服务可用。     closeable=False,     # 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接)     threadlocal=None,  # 本线程独享值得对象,用于保存链接对象,如果链接对象被重置     host='127.0.0.1',     port=3306,     user='root',     password='123456',     database='test',     charset='utf8' )  def func():     conn = POOL.connection(shareable=False)     cursor = conn.cursor()     cursor.execute('select * from user')     result = cursor.fetchall()     print(result)     cursor.close()     conn.close() if __name__ == '__main__':      func()

创建一批连接到连接池,供所有线程共享使用

setting.py

from datetime import timedelta from redis import Redis import pymysql from DBUtils.PooledDB import PooledDB, SharedDBConnection  class Config(object):     DEBUG = True     SECRET_KEY = "umsuldfsdflskjdf"     PERMANENT_SESSION_LIFETIME = timedelta(minutes=20)     SESSION_REFRESH_EACH_REQUEST= True     SESSION_TYPE = "redis"     PYMYSQL_POOL = PooledDB(         creator=pymysql,  # 使用链接数据库的模块         maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数         mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建         maxcached=5,  # 链接池中最多闲置的链接,0和None不限制         maxshared=3,         # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。         blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错         maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制         setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]         ping=0,         # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always         host='127.0.0.1',         port=3306,         user='root',         password='123456',         database='s8day127db',         charset='utf8'     )  class ProductionConfig(Config):     SESSION_REDIS = Redis(host='192.168.0.94', port='6379')    class DevelopmentConfig(Config):     SESSION_REDIS = Redis(host='127.0.0.1', port='6379')   class TestingConfig(Config):     pass

utils/sql.py

import pymysql from settings import Config class SQLHelper(object):      @staticmethod     def open(cursor):         POOL = Config.PYMYSQL_POOL         conn = POOL.connection()         cursor = conn.cursor(cursor=cursor)         return conn,cursor      @staticmethod     def close(conn,cursor):         conn.commit()         cursor.close()         conn.close()      @classmethod     def fetch_one(cls,sql,args,cursor =pymysql.cursors.DictCursor):         conn,cursor = cls.open(cursor)         cursor.execute(sql, args)         obj = cursor.fetchone()         cls.close(conn,cursor)         return obj      @classmethod     def fetch_all(cls,sql, args,cursor =pymysql.cursors.DictCursor):         conn, cursor = cls.open(cursor)         cursor.execute(sql, args)         obj = cursor.fetchall()         cls.close(conn, cursor)         return obj

使用:

obj = SQLHelper.fetch_one("select id,name from users where name=%(user)s and pwd=%(pwd)s", form.data)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!