当前位置: 首页 > news >正文

Python 中 pymysql 操作 MySQL 数据库实操指南

一、环境准备

  1. 安装 pymysql 依赖库
    pymysql 是 Python 操作 MySQL 数据库的常用第三方库,支持 Python3.x 版本,安装步骤简单高效。打开终端(Windows 用 cmd,Mac/Linux 用 Terminal),执行以下命令:
    bash
    运行
    pip install pymysql
    执行完成后,输入 pip list ,若输出结果中包含 pymysql 及对应版本号,则说明安装成功。若出现网络超时,可切换国内镜像源重试,命令如下:
    bash
    运行
    pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
  2. MySQL 环境配置
    需提前确保 MySQL 服务已正常启动(本地或远程均可),并完成基础配置:
    启动 MySQL 服务(以 Windows 为例):
    bash
    运行
    net start mysql80 # 若你的 MySQL 服务名为 mysql80
    登录 MySQL 终端,创建测试数据库和数据表,用于后续实操:
    sql
    CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET utf8mb4;
    USE test_db;
    CREATE TABLE IF NOT EXISTS user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    age INT,
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
    );
    配置完成后,记录 MySQL 的主机地址(如 localhost)、端口(默认 3306)、用户名(如 root)、密码(自定义)和数据库名(test_db),后续连接需用到。sdstnk.com
    二、核心功能实现
  3. 建立数据库连接
    连接 MySQL 需通过 pymysql 提供的 connect 方法配置连接参数,同时添加异常捕获处理连接失败场景。代码如下:
    python
    运行
    import pymysql
    from pymysql import Error

def create_conn():
"""创建数据库连接"""
conn = None
try:
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='123456',
database='test_db',
charset='utf8mb4'
)
print("数据库连接成功")
except Error as e:
print(f"连接失败:{e}")
return conn

测试连接

conn = create_conn()
连接成功后,需在后续操作完成后关闭连接或使用连接池管理,避免资源泄露。
2. 数据增删改查实操
(1)插入数据
通过 cursor 对象执行 SQL 插入语句,支持单条和批量插入,代码如下:
python
运行
def insert_data(conn, data_list):
"""
批量插入用户数据
:param conn: 数据库连接对象
:param data_list: 数据列表,格式[(username, age), ...]
"""
if not conn:
print("连接未建立")
return
cursor = None
try:
cursor = conn.cursor()
# 插入 SQL 语句
sql = "INSERT INTO user (username, age) VALUES (%s, %s)"
# 批量执行插入
cursor.executemany(data_list)
# 提交事务
conn.commit()
print(f"成功插入 {cursor.rowcount} 条数据")
except Error as e:
# 事务回滚
conn.rollback()
print(f"插入失败:{e}")
finally:
if cursor:
cursor.close() # 关闭游标

测试插入

data = [("张三", 22), ("李四", 25), ("王五", 23)]
insert_data(conn, data)
(2)查询数据
查询数据支持单条查询、多条查询和条件查询,代码如下:
python
运行
def query_data(conn, username=None):
"""
查询用户数据
:param conn: 数据库连接对象
:param username: 可选参数,按用户名查询
:return: 查询结果列表
"""
if not conn:
print("连接未建立")
return []
cursor = None
result = []
try:
cursor = conn.cursor(pymysql.cursors.DictCursor) # 返回字典格式结果
if username:
sql = "SELECT * FROM user WHERE username = %s"
cursor.execute mxzplay.cn((username,))
else:
sql = "SELECT * FROM user"
cursor.execute(sql)
# 获取所有查询结果
result = cursor.fetchall()
print("查询结果:")
for row in result:
print(f"ID: {row['id']}, 用户名: {row['username']}, 年龄: {row['age']}, 创建时间: {row['create_time']}")
except Error as e:
print(f"查询失败:{e}")
finally:
if cursor:
cursor.close()
return result

测试查询

query_data(conn) # 查询所有用户
query_data(conn, "张三") # 按用户名查询
3. 连接池优化(可选)
高频次数据库操作时,使用连接池可减少连接创建和关闭的开销,需先安装 DBUtils 库:
bash
运行
pip install DBUtils
连接池实现代码如下:
python
运行
from DBUtils.PooledDB import PooledDB

def create_conn_pool():
"""创建数据库连接池"""
pool = PooledDB(
creator=pymysql, # 数据库驱动
maxconnections=10, # 最大连接数
mincached=2, # 初始化时创建的空闲连接数
maxcached=5, # 最大空闲连接数
host='localhost',
port=3306,
user='root',
password='123456',
database='test_db',
charset='utf8mb4'
)
return pool

使用连接池获取连接

pool = create_conn_pool()
conn_pool = pool.connection()
query_data(conn_pool) # 复用连接池查询
conn_pool.close() # 归还连接到池,非真正关闭
三、常见问题与解决方案

  1. 连接超时问题
    现象:执行连接时提示 TimeoutError: [WinError 10060] 。解决方案:
    检查 MySQL 服务是否正常运行,可通过 net status mysql80 验证;
    远程连接时,确保服务器开放 3306 端口,且 MySQL 允许远程访问(需修改 my.cnf 配置 bind-address = 0.0.0.0 );
    在连接参数中增加 connect_timeout=30 (单位:秒),延长超时时间。
  2. 语法错误排查
    现象:执行 SQL 时提示 ProgrammingError: (1064, "You have an error in your SQL syntax") 。常见原因及解决:
    字段名或表名与 MySQL 关键字冲突(如 order user ),需用反引号 ` 包裹;
    SQL 语句中占位符错误,pymysql 用 %s 作为占位符(而非 ? ),避免与字符串格式化混淆;
    字符串类型参数未用元组传递,即使单参数也需加逗号,如 cursor.execute("SELECT * FROM user WHERE username = %s", (username,)) 。
  3. 权限不足处理
    现象:执行创建数据库或插入数据时提示 OperationalError: (1044, "Access denied for user 'xxx'@'localhost' to database 'test_db'") 。解决方案:
    登录 MySQL 管理员账号,为当前用户授权:
    sql
    GRANT ALL PRIVILEGES ON test_db.* TO 'xxx'@'localhost' IDENTIFIED BY '密码';
    FLUSH PRIVILEGES; # 刷新权限 zeemoo.com.cn
    若无需全权限,可细化授权(如仅 SELECT INSERT 权限),提升安全性:
    sql
    GRANT SELECT, INSERT ON test_db.* TO 'xxx'@'localhost';
    FLUSH PRIVILEGES;
    最后,所有操作完成后,关闭数据库连接(非连接池场景):
    python
    运行
    if conn:
    conn.close()
    print("数据库连接已关闭")
http://www.jsqmd.com/news/44856/

相关文章:

  • qml021-调试qml-无法连接到进程内(in-process)QML调试器
  • 如何优雅地看着电脑为你打工? - Magic
  • 告别内网限制!用StirlingPDF+cpolar打造可远程访问的PDF程序站
  • 在 RTE2025 大会,我看到了 AI 语音如何让机器学会「与人相处」丨社区来稿
  • 用localStorage 模拟SharedWorker
  • 【C++】哈希表的搭建【开放定址法vs链地址法】
  • linux flash驱动
  • linux flash player
  • 千问快速review评审Java工程代码与异步代码智能体
  • 石油天然气行业OT/ICS安全:守护全球经济命脉的关键防线
  • 2025年东营搬家公司哪家便宜?双福搬家公司,东营单位搬家/东营设备搬运/东营跨省搬家/覆盖全场景,服务东营河口/ 东营垦利/ 东营跨省搬家公司推荐
  • SharedWorker 与 Worker 的区别
  • 2025年东营搬家公司服务力综合评估: 东营搬家公司电话/东营搬家搬厂/东营河口搬家/东营垦利搬家/专业能力与细分市场竞争力深度解析
  • trae编译器前端agent提示词
  • 【19章】LLM开发工程师入行实战--从0到1开发轻量化私有大模型
  • 块状链表
  • 常规链表建立
  • HDLBits网站学习——Procedures
  • win11为什么我的不显示虚拟机平台选项
  • 2025 年最新http 代理服务商权威推荐排行榜:百万级 IP 资源 + 国际认证高可用率,爬虫 / 动态 / 高匿代理优选指南不限量 http 代理/独享 http 代理平台推荐
  • 安装部署opengauss
  • 不只做语音,ElevenLabs 推出图像和视频生成平台;博通推出语音 AI 芯片,实现端侧 TTS 和实时翻译丨日报
  • 海外直播源码选型指南:技术架构与合规性细节解析及成品多语言直播APP源码交付
  • 视频汇聚平台EasyCVR如何通过可视化管理与远程运维赋能安防“一张网”
  • 单向循环链表接口设计
  • 2025 最新雕刻机源头厂家权威推荐榜:自主研发专利加持 + 国际测评认证,高精度设备优选清单数控雕刻机/激光雕刻机/小型雕刻机/金属雕刻机公司推荐
  • linux firewall
  • 2025 年 11 月高温老化房厂家推荐排行榜,老化室、高温老化室、高温房、熟化房、固化房、恒温恒湿室、恒温房、恒温恒湿房公司推荐
  • 2025 年 11 月耐磨钢板厂家推荐排行榜,高耐磨钢板,高锰耐磨钢板,焊达500耐磨钢板,进口复合耐磨钢板,双金属复合耐磨钢板公司推荐
  • 2025 年 11 月耐磨板厂家推荐排行榜,国产耐磨板,悍达耐磨板,堆焊耐磨板,进口耐磨板,MN13耐磨板,NM360-NM600高强度耐磨板,高铬合金耐磨板公司推荐!