【Python模块】——pymysql

pymysql是python操作mysql的标准库,可以通过pip install快速导入pymysql包操作数据库

使用pymysql操作mysql

简单demo

import pymysql
connect = pymysql.connect(
    host="localhost",
    port=3306,
    user="root",
    password="root",
    database="my_database",
    # charset="utf8mb4"
)
cursor = connect.cursor()

# 查询语句1
sql = "select * from user where name = %(name)s"
ret = cursor.execute(sql, {"name": "ls"})
# 查询语句2
sql = "select * from user where name = %s"
ret = cursor.execute(sql, "ls")
print(ret)

result = cursor.fetchall()
print("result", result)

cursor.close()
connect.close()

自定义SqlHelper

import pymysql

class MySQLClient(object):
    def __init__(self, **kwargs):
        self.conn = pymysql.connect(
            **kwargs
        )
        self.cursor = self.conn.cursor()


    def query(self, sql, *args):
        try:
            rowcount = self.cursor.execute(sql, *args)
            return rowcount
        except Exception as e:
            raise e


    def update(self, sql, *args):
        self.cursor.execute(sql, *args)
        self.conn.commit()


    def insert(self, sql, *args):
        self.cursor.execute(sql, *args)
        self.conn.commit()


    def fetch_one(self, sql, *args):
        self.query(sql, *args)
        result = self.cursor.fetchone()
        return result


    def fetch_all(self, sql, *args):
        self.query(sql, *args)
        result = self.cursor.fetchone()
        return result

    def close(self):
        self.cursor.close()
        self.conn.close()


config = {
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "root",
    "database": "my_database",
}

mysql_client = MySQLClient(**config)
sql = "select * from user where name=%s"
ret = mysql_client.fetch_one(sql, "ls")
print(ret)

# mysql_client.close()

借助DButils创建数据库连接池

DButils模块可以通过创建数据库连接池,提升数据库操作性能;
实现思路:

  1. 定义SqlHelper类
  2. 通过__init__方法定义pool=PoolDB(**kwargs),_local=threading.local()
  3. 定义__enter__获取connection与cursor和__exit__关闭connection与cursor,可支持with 上下文操作
  4. 为了保证每次获取的connection与cursor不会将之前的覆盖掉,引入threading.local进行保存;self._local = {thread_id: {“stack”: [(connection, cursor)]}}
#!/usr/bin/env python  
# -*- coding:utf-8 -*-  
import pymysql
from dbutils.pooled_db import PooledDB
from threading import local

class SqlHelper(object):
    def __init__(self):
        self.pool = PooledDB(
            creator=pymysql,  # 使用链接数据库的模块
            maxconnections=5,  # 连接池允许的最大连接数,0和None表示不限制连接数
            mincached=1,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
            # maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
            blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
            maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
            setsession=[],  # 开始会话前执行的命令列表
            host='localhost',
            port=3306,
            user='root',
            password='root',
            database='my_database',
            charset='utf8'
        )
        self._local = local()

    def open(self):
        connection = self.pool.connection()
        cursor = connection.cursor()
        return  connection, cursor

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

    def __enter__(self):
        conn, cursor = self.open()
        rv =  getattr(self._local, "stack", None)
        if not rv:
            self._local.stack = [(conn, cursor)]
        else:
            self._local.stack.append((conn, cursor))
        return cursor

    def __exit__(self, exc_type, exc_val, exc_tb):
        rv = getattr(self._local, "stack", None)
        if not rv:
            # del self._local.stack
            return
        elif len(rv) == 1:
            conn, cursor = rv[-1]
            # del self._local.stack
            return
        else:
            conn, cursor = rv.pop()
        cursor.close()
        conn.close()


    def fetchone(self, sql, *args):
        conn, cursor = self.open(self)
        try:
            rowcount = cursor.execute(sql, *args)
            ret = cursor.fetchone()
            return ret
        except Exception as e:
            raise


    def fetchall(self, sql, *args):
        conn, cursor = self.open(self)
        try:
            rowcount = cursor.execute(sql, *args)
            ret = cursor.fetchall()
            return ret
        except Exception as e:
            raise

db = SqlHelper()

sql = "select * from user"
with db as c1:
    ret = c1.execute(sql)
    print(ret)
    with db as c2:
        ret = c2.execute(sql)
        print(ret)

使用DButils的另一种写法

使用这种写法,每次都实例化SqlHelper,保证每次获取的connection和cursor不被覆盖

#!/usr/bin/env python  
# -*- coding:utf-8 -*-  
""" 
1. 定义全局变量POOL=pooledDB(**kwargs)
2. 每次用到db就实例化一次
"""
import pymysql
from dbutils.pooled_db import PooledDB
from threading import local

pool = PooledDB(
            creator=pymysql,  # 使用链接数据库的模块
            maxconnections=0,  # 连接池允许的最大连接数,0和None表示不限制连接数
            mincached=1,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
            # maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
            blocking=False,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
            maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
            setsession=[],  # 开始会话前执行的命令列表
            host='localhost',
            port=3306,
            user='root',
            password='root',
            database='my_database',
            charset='utf8'
        )

class SqlHelper(object):
    def __init__(self):
        self.conn = None
        self.cursor = None

    def open(self):
        self.connection = pool.connection()
        self.cursor = self.connection.cursor()
        return  self.connection, self.cursor

    def close(self):
        self.cursor.close()
        self.conn.close()

    def __enter__(self):
        self.conn, self.cursor = self.open()
        return self.cursor

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()



db = SqlHelper()

sql = "select * from user"
with db as c1:
    ret = c1.execute(sql)
    print("c1.cursor: ", db.cursor)
    print(ret)
    with db as c2:
        ret = c2.execute(sql)
        print("c2.cursor: ", db.cursor)  # 一个实例对象是可以多次调用enter方法的,但db.cursor发生了改变,即上一次的连接丢了
        print(ret)

        print(type(c1), type(c2))

        print(c1 is c2) # false


    print("c1.cursor: ", db.cursor) # c2.cursor将c1.cursor覆盖了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/977936.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

考研/保研复试英语问答题库(华工建院)

华南理工大学建筑学院保研/考研 英语复试题库,由华工保研er和学硕笔试第一同学一起整理,覆盖面广,助力考研/保研上岸!需要👇载可到文章末尾见小🍠。 以下是主要内容: Part0 复试英语的方法论 Pa…

Linux7-线程

一、前情回顾 chdir();功能: 函数用于改变当前进程的工作目录。 参数:路径(Path):这是一个字符串参数,表示要切换到的目标目录的路径。 返回值: 成功:在成功改变当前工作目…

防火墙双机热备---VRRP,VGMP,HRP(超详细)

双机热备技术-----VRRP,VGMP,HRP三个组成 注:与路由器VRRP有所不同,路由器是通过控制开销值控制数据包流通方向 防火墙双机热备: 1.主备备份模式 双机热备最大的特点就是防火墙提供了一条专门的备份通道(心…

LabVIEW形状误差测量系统

在机械制造领域,形状与位置公差(GD&T)直接影响装配精度与产品寿命。国内中小型机加工企业因形状误差导致的返工率高达12%-18%。传统测量方式存在以下三大痛点: ​ 设备局限:机械式千分表需人工读数,精度…

本地部署大模型: LM Studio、Open WebUI 与 Chatbox 全面对比以及选型指南

1. 工具概述 LM Studio 定位:专注于本地化大模型实验与推理的桌面工具,支持多模型并行、Hugging Face集成及离线运行。 核心功能: 图形化界面直接加载GGUF模型文件,支持NVIDIA/AMD GPU加速。 内置OpenAI兼容API,可搭…

百度觉醒,李彦宏渴望光荣

文 | 大力财经 作者 | 魏力 2025年刚刚开年,被一家名为DeepSeek的初创公司强势改写。在量化交易出身的创始人梁文锋的带领下,这支团队以不到ChatGPT 6%的训练成本,成功推出了性能可与OpenAI媲美的开源大模型。 此成果一经问世,…

mysql 迁移到人大金仓数据库

我是在windows上安装了客户端工具 运行数据库迁移工具 打开 在浏览器输入http://localhost:54523/ 账号密码都是kingbase 添加mysql源数据库连接 添加人大金仓目标数据库 添加好的两个数据库连接 新建迁移任务 选择数据库 全选 迁移中 如果整体迁移不过去可以单个单个或者几个…

Spring Cloud — Hystrix 服务隔离、请求缓存及合并

Hystrix 的核心是提供服务容错保护,防止任何单一依赖耗尽整个容器的全部用户线程。使用舱壁隔离模式,对资源或失败单元进行隔离,避免一个服务的失效导致整个系统垮掉(雪崩效应)。 1 Hystrix监控 Hystrix 提供了对服务…

【链 表】

【链表】 一级目录1. 基本概念2. 算法分析2.1 时间复杂度2.2 空间复杂度2.3 时空复杂度互换 线性表的概念线性表的举例顺序表的基本概念顺序表的基本操作1. 初始化2. 插入操作3. 删除操作4. 查找操作5. 遍历操作 顺序表的优缺点总结优点缺点 树形结构图形结构单链表基本概念链表…

记录锁,间隙锁,Next-Key Lock

记录锁,间隙锁,Next-Key Lock mysql的锁机制一、InnoDB行锁的种类1、记录锁(Record Lock)(1)不加索引,两个事务修改同一行记录(2)不加索引,两个事务修改同一表…

vue3父子组件props传值,defineprops怎么用?(组合式)

目录 1.基础用法 2.使用解构赋值的方式定义props 3.使用toRefs的方式解构props (1).通过ref响应式变量&#xff0c;修改对象本身不会触发响应式 1.基础用法 父组件通过在子组件上绑定子组件中定义的props&#xff08;:props“”&#xff09;传递数据给子组件 <!-- 父组件…

鸿蒙Next-方法装饰器以及防抖方法注解实现

以下是关于 鸿蒙Next&#xff08;HarmonyOS NEXT&#xff09;中 MethodDecorator 的详细介绍及使用指南&#xff0c;结合了多个技术来源的实践总结&#xff1a; 一、MethodDecorator 的概念与作用 MethodDecorator 是鸿蒙Next框架中用于装饰类方法的装饰器&#xff0c;属于 Ark…

快速入门——状态管理VueX

Vuex介绍 状态管理 每一个Vuex应用的核心都是一个store&#xff0c;与普通的全局对象不同的是&#xff0c;基于Vue数据与视图绑定的特点&#xff0c;当store中的状态发生变化时&#xff0c;与之绑定的视图也会被重新渲染。 store中的状态不允许被直接修改&#xff0c;改变sto…

java进阶学习脑图

今天开始分享我的第一篇博客&#xff0c;先放上我自己花费一个月完成的java进阶学习脑图吧&#xff01; 谁都想像R大一样对JVM可以知无不言&#xff0c;言无不尽&#xff1b; 谁都想像Doug Lea一样可以参与JUC这种核心模块的开发&#xff1b; 但是&#xff0c;不能只停留在想…

【设计师专属】智能屏幕取色器Pro|RGB/HEX双模式|快捷键秒存|支持导出文档|C++ QT

&#x1f525; “1秒锁定千万色值&#xff0c;让灵感不再流失&#xff01;” ✔ 像素级精准捕捉 ✔ 快捷键极速记录 ✔ 数据一键导出 ✔ 开发者/设计师效率神器 "还在手动截图比色&#xff1f;加班改稿只因色差&#xff1f;前端还原总被吐槽&#xff1f; &#x1f449;…

力扣 下一个排列

交换位置&#xff0c;双指针&#xff0c;排序。 题目 下一个排列即在组成的排列中的下一个大的数&#xff0c;然后当这个排列为降序时即这个排列最大&#xff0c;因为大的数在前面&#xff0c;降序排列的下一个数即升序。所以&#xff0c;要是想找到当前排列的下一个排列&…

在 HuggingFace 中使用 SSH 进行下载数据集和模型

SSH 是一种 安全通讯的协议&#xff0c;我们通过配置 SSH 的密钥 来在 Git 上实现 Huggingface 模型的命令行下载。 参考网址&#xff1a;https://huggingface.co/docs/hub/security-git-ssh 点击自己的头像&#xff0c;点击 Add SSH key 在 Windows 上&#xff0c;我们实现已…

【生成模型】【ComfyUI(三)】使用WebAPI批量调用ComfyUI

可以参考【生成模型】【ComfyUI&#xff08;一&#xff09;】Flux与Flux-Fill部署与API调用中Flux-Fill部分 1. 调整Workflow 我们要部署以下workflow 做两个修改 输入改为从Load Image(Base64) 读入图片&#xff0c;当然使用上面的从路径中读图也是可以的输出改为SaveImag…

【多模态大模型】端侧语音大模型minicpm-o:手机上的 GPT-4o 级多模态大模型

MiniCPM-o ,它是一款 开源、轻量级 的多模态大语言模型,目标是在手机等资源受限的环境中实现 GPT-4o 级别的多模态能力! 1. MiniCPM-o:小身材,大能量! MiniCPM-o 的名字已经暗示了它的核心特点:Mini (小巧) 和 CPM (中文预训练模型),最后的 “o” 则代表 Omnimodal …

【C++】深入理解List:双向链表的应用

凭时间赢来的东西&#xff0c;时间肯定会为之作证。 前言 这是我自己学习C的第七篇博客总结。后期我会继续把C学习笔记开源至博客上。 上一期笔记是关于C的vector类知识&#xff0c;没看的同学可以过去看看&#xff1a;【C】探索Vector&#xff1a;灵活的数据存储解决方案-CS…