python3使用pymysql連接池操作mysql

Flask之數據庫連接池DBuilt

BUtils是Python的一個用於實現數據庫連接池的模塊。

如果沒有連接池,使用pymysql來連接數據庫時,單線程應用完全沒有問題,但如果涉及到多線程應用那麼就需要加鎖,一旦加鎖那麼連接勢必就會排隊等待,當請求比較多時,性能就會降低了。

此連接池有兩種連接模式:

模式一:爲每個線程創建一個連接,線程即使調用了close方法,也不會關閉,只是把連接重新放到連接池,供自己線程再次使用。當線程終止時,連接自動關閉

模式二:創建一批連接到連接池,供所有線程共享使用。
PS:由於pymysql、MySQLdb等threadsafety值爲1,所以該模式連接池中的線程會被所有線程共享。

本文出自https://blog.csdn.net/weixin_30628077/article/details/96887344

 下面的實例也是採用第二種方式           

MySQL 使用連接池封裝pymysql

一、在utils.py中寫

import pymysql
from DBUtils.PooledDB import PooledDB

POOL = PooledDB(
    creator=pymysql,  # 使用鏈接數據庫的模塊
    maxconnections=6,  # 連接池允許的最大連接數,0和None表示不限制連接數
    mincached=2,  # 初始化時,鏈接池中至少創建的空閒的鏈接,0表示不創建
    maxcached=5,  # 鏈接池中最多閒置的鏈接,0和None不限制
    maxshared=1,  # 鏈接池中最多共享的鏈接數量,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='',
    database='ziji',
    charset='utf8'
)


二、在sqlhelper.py中寫入:
from utils import POOL
import pymysql


def create_conn():
    conn = POOL.connection()
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    return conn, cursor


def close_conn(conn, cursor):
    conn.close()
    cursor.close()


def select_one(sql, args):
    conn, cur = create_conn()
    cur.execute(sql, args)
    result = cur.fetchone()
    close_conn(conn, cur)
    return result


def select_all(sql, args):
    conn, cur = create_conn()
    cur.execute(sql, args)
    result = cur.fetchall()
    close_conn(conn, cur)
    return result


def insert_one(sql, args):
    conn, cur = create_conn()
    result = cur.execute(sql, args)
    conn.commit()
    close_conn(conn, cur)
    return result


def delete_one(sql,args):
    conn,cur = create_conn()
    result = cur.execute(sql,args)
    conn.commit()
    close_conn(conn,cur)
    return result

def update_one(sql,args):
    conn,cur = create_conn()
    result = cur.execute(sql,args)
    conn.commit()
    close_conn(conn,cur)
    return result



# sql = "insert into stu(id,name,age) VALUE (%s,%s,%s)"   #增加
# res = insert_one(sql, [2,"飛機", 28])
# print(res)

# sql = "delete from stu where name = %s"   #刪除
# res = delete_one(sql, "哪吒")
# print(res)

# sql = "select * from stu"   #查詢全部
# res = select_all(sql, [])
# print(res)

# sql = "select * from stu where name=%s"   #查詢一條
# res = select_one(sql, "趙振偉")
# print(res)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章