首页 > 数据库 >python操作mysql

python操作mysql

时间:2024-01-30 12:55:06浏览次数:42  
标签:python self db pymysql cursor def mysql 操作 conn

python操作mysql

1.数据库连接池

在操作数据库时需要使用数据库连接池。

pip3.9 install pymysql # 安装 pymysql
pip3.9 install dbutils # 安装 dbutils


import threading
import pymysql
from dbutils.pooled_db import PooledDB

MYSQL_DB_POOL = PooledDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxconnections=5,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=3,  # 链接池中最多闲置的链接,0和None不限制
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    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='root123',
    database='userdb',
    charset='utf8'
)


def task():
    # 去连接池获取一个连接
    conn = MYSQL_DB_POOL.connection()
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    
    cursor.execute('select sleep(2)')
    result = cursor.fetchall()
    print(result)

    cursor.close()
    # 将连接交换给连接池
    conn.close()

def run():
    for i in range(10):
        t = threading.Thread(target=task)
        t.start()


if __name__ == '__main__':
    run()

2. pymysql db模版

# db.py
import pymysql
from dbutils.pooled_db import PooledDB


class DBHelper(object):

    def __init__(self):
        # TODO 此处配置,可以去配置文件中读取。
        self.pool = PooledDB(
            creator=pymysql,  # 使用链接数据库的模块
            maxconnections=5,  # 连接池允许的最大连接数,0和None表示不限制连接数
            mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
            maxcached=3,  # 链接池中最多闲置的链接,0和None不限制
            blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
            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='root123',
            database='userdb',
            charset='utf8'
        )

    def get_conn_cursor(self):
        conn = self.pool.connection()
        cursor = conn.cursor(pymysql.cursors.DictCursor)
        return conn, cursor

    def close_conn_cursor(self, *args):
        for item in args:
            item.close()

    def exec(self, sql, **kwargs):
        conn, cursor = self.get_conn_cursor()

        cursor.execute(sql, kwargs)
        conn.commit()

        self.close_conn_cursor(conn, cursor)

    def fetch_one(self, sql, **kwargs):
        conn, cursor = self.get_conn_cursor()

        cursor.execute(sql, kwargs)
        result = cursor.fetchone()

        self.close_conn_cursor(conn, cursor)
        return result

    def fetch_all(self, sql, **kwargs):
        conn, cursor = self.get_conn_cursor()

        cursor.execute(sql, kwargs)
        result = cursor.fetchall()

        self.close_conn_cursor(conn, cursor)

        return result


db = DBHelper()

2.1 通过db模版操作数据库

from db import db

db.exec("insert into d1(name) values(%(name)s)", name="serein")

ret = db.fetch_one("select * from d1")
print(ret)

ret = db.fetch_one("select * from d1 where id=%(nid)s", nid=3)
print(ret)

ret = db.fetch_all("select * from d1")
print(ret)

ret = db.fetch_all("select * from d1 where id>%(nid)s", nid=2)
print(ret)

2.2 通过上下文管理操作数据库

with 获取连接:
执行SQL(执行完毕后,自动将连接交还给连接池)

# db_context.py
import threading
import pymysql
from dbutils.pooled_db import PooledDB

POOL = PooledDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxconnections=5,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=3,  # 链接池中最多闲置的链接,0和None不限制
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
    ping=0,
    host='127.0.0.1',
    port=3306,
    user='root',
    password='root123',
    database='userdb',
    charset='utf8'
)


class Connect(object):
    def __init__(self):
        self.conn = conn = POOL.connection()
        self.cursor = conn.cursor(pymysql.cursors.DictCursor)

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.cursor.close()
        self.conn.close()
		
    # 操作数据
    def exec(self, sql, **kwargs):
        self.cursor.execute(sql, kwargs)
        self.conn.commit()

    # 返回一行
    def fetch_one(self, sql, **kwargs):
        self.cursor.execute(sql, kwargs)
        result = self.cursor.fetchone()
        return result

    # 返回所有行
    def fetch_all(self, sql, **kwargs):
        self.cursor.execute(sql, kwargs)
        result = self.cursor.fetchall()
        return result

from db_context import Connect

with Connect() as obj:
    # print(obj.conn)
    # print(obj.cursor)
    ret = obj.fetch_one("select * from d1")
    print(ret)

    ret = obj.fetch_one("select * from d1 where id=%(id)s", id=3)
    print(ret)

标签:python,self,db,pymysql,cursor,def,mysql,操作,conn
From: https://www.cnblogs.com/Formerly/p/17996858

相关文章

  • Python调用微信OCR识别文字和坐标
    python的ocr识别最方便的最准确的方法就是直接调微信的ocr注意:调用的时候先把微信关掉。importosimportjsonimporttimefromwechat_ocr.ocr_managerimportOcrManager,OCR_MAX_TASK_IDwechat_ocr_dir=r"C:\Users\mydell\AppData\Roaming\Tencent\WeChat\XPlugin\P......
  • MySQL查看bin_log日志
    有这样一段业务逻辑,首先保存业务数据,然后发送报文,最后确认报文回来以后更新业务数据。伪代码大概是这样的:/***保存数据,并调用发送报文方法*/publicvoidsave(){//0.保存数据//调用send()方法send();}/***发送报文*/publicvoidsend(){/......
  • python虚拟环境venv
    使用venv(系统默认安装):创建一个新的虚拟环境:运行命令python-mvenvmyenv其中myenv是你的虚拟环境的名称。激活虚拟环境:会根据当前运行版本win/linux进行自动激活activate在激活的虚拟环境中安装所需的软件包:运行命令pipinstallpackage_name-ihttps://pypi.tuna.tsin......
  • python 获取本机IP
    python获取本机所有IP地址的方法原链接:https://pythonjishu.com/gygjrclwnkmhnlf/2023年5月23日下午12:35 • python获取本机所有IP地址的方法,可以通过Python标准库中的socket模块来实现。下面是完整攻略:1.使用socket模块先导入socket模块,然后创建一个sock......
  • python中with的用法
    一、文件操作#自行车f=open("filename")f.write()f.close()上述代码存在的问题:(1)直接open()打开需要手动关闭,并且容易忘记关闭(2)当文件操作出现异常导致程序提早离开,而没有执行关闭文件操作#小轿车try:f=open("xxx")f.write()#文件操作except:doso......
  • Python中__init__.py的作用
    Pytorch学习笔记-(__init__)_pytorch3.8的init文件-CSDN博客 (推荐)Python:__init__.py的作用-知乎(zhihu.com) (推荐)Python中的__init__.py与模块导入___init__.py导入自定义py-CSDN博客你常常看到的__init__.py到底是个啥?-知乎(zhihu.com) 总结一下Python中__ini......
  • MySQL连接控制插件导致的连接数过多问题处理
    生产环境收到一波连接数告警,而该业务实际压力并不大。查看后发现有大量的waitinginconnection_controlplugin状态的连接等待。该等待连接数有一千多个。connection_control组件是由于前段时间的安全合规审查要求安装的。怕影响生产真实连接,将单个用户的登陆失败重试connectio......
  • Easy-Es操作Elasticsearch
    目录1Easy-Es1.1简介1.2MySQL与Easy-Es语法对比1.3集成及配置1.3.1pom.xml1.3.2配置1.4使用1.4.1注解的使用1.4.2EsMapper接口1.4.3简单搜索1.5使用案例1.5.1综合商品搜索1.5.2相关商品推荐1.5.3聚合搜索商品相关信息1Easy-Es使用过SpringData操作ES的小伙伴应......
  • python第五节:集合set(3)
    集合遍历for循环遍历集合中元素例子1:set1={'a','b','cde','张三','123'} foriinset1:   print(i) 结果:acdeb张三123 enumerate遍历索引和元素例子2:set1={'a','b','cde','张三','123'} forin......
  • MySQL 系统变量 group_replication_get_communication_protocol
    MySQL系统变量group_replication_get_communication_protocol(MonJan2923:14:512024)[root@GreatSQL][(none)]>selectversion(),group_replication_get_communication_protocol();+-----------+------------------------------------------------+|version()|gr......