Python 操作 MySQL 数据库

环境准备

bash 复制代码
pip3 install pymysql

前提条件

  1. 本地 / 远程已安装 MySQL 服务
  2. 拥有 MySQL 数据库的连接信息(主机、端口、用户名、密码、数据库名)
  3. 确保 MySQL 服务正常运行,且网络可访问

操作流程

Python 操作 MySQL 固定 5 步:

  1. 建立数据库连接
  2. 创建游标对象(执行 SQL 的工具)
  3. 执行 SQL 语句
  4. 提交事务(写操作必须)/ 获取查询结果
  5. 关闭游标 + 关闭连接

重要规范

  1. 所有写操作(INSERT/UPDATE/DELETE)必须用 commit() 提交,否则数据不会生效
  2. 必须使用 % s 占位符,不要用字符串拼接,防止 SQL 注入
  3. 操作完成后必须关闭游标和连接,释放资源
  4. try-except-finally 保证异常时数据安全

常见问题

  1. 连接失败:检查主机、端口、用户名、密码、数据库名是否正确
  2. 数据不生效 :忘记写 conn.commit()
  3. 中文乱码 :字符集设置为 utf8mb4
  4. SQL 报错:检查 SQL 语法,优先使用占位符传参

必须掌握的关键字

  • connect():建立数据库连接
  • cursor():创建游标(执行 SQL 的核心对象)
  • execute():执行单条 SQL
  • executemany():执行批量 SQL
  • commit():提交事务(增 / 删 / 改必须调用
  • rollback():事务回滚(出错时撤销操作)
  • fetchone()/fetchall()/fetchmany():获取查询结果
  • close():关闭游标 / 连接

核心流程:连接 → 游标 → 执行 SQL → 提交 / 回滚 → 关闭

增删改查核心函数:execute()/executemany()/fetchone()/fetchall()

必写规范

  • 增删改必须执行 conn.commit(),查询不需要
  • 出错必须执行 conn.rollback() 回滚事务
  • 最后必须关闭游标和连接,避免资源泄漏

连接数据库 创建表

python 复制代码
# 1. 获取数据库连接
conn = pymysql.connect(**DB_CONFIG)

# 2. 创建游标对象
cursor = conn.cursor()

# 3. 执行SQL:创建用户表(不存在则创建)
create_table_sql = """
CREATE TABLE IF NOT EXISTS users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    age INT,
    gender VARCHAR(10)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
"""
cursor.execute(create_table_sql)
print("数据表创建成功")

# 4. 关闭资源
cursor.close()
conn.close()

新增数据(INSERT)

单条插入

python 复制代码
conn = pymysql.connect(**DB_CONFIG)
cursor = conn.cursor()

# 推荐写法:%s 占位符(防SQL注入)
insert_sql = "INSERT INTO users(name, age, gender) VALUES(%s, %s, %s)"
data = ("张三", 20, "男")

try:
    cursor.execute(insert_sql, data)
    conn.commit()  # 增删改必须提交事务
    print("单条数据插入成功")
except Exception as e:
    conn.rollback()  # 出错回滚
    print("插入失败:", e)
finally:
    cursor.close()
    conn.close()

批量插入(效率更高)

python 复制代码
conn = pymysql.connect(**DB_CONFIG)
cursor = conn.cursor()

insert_sql = "INSERT INTO users(name, age, gender) VALUES(%s, %s, %s)"
# 多条数据用列表包裹
datas = [
    ("李四", 22, "女"),
    ("王五", 25, "男"),
    ("赵六", 19, "女")
]

try:
    cursor.executemany(insert_sql, datas)  # 批量执行
    conn.commit()
    print(f"批量插入 {cursor.rowcount} 条数据成功")
except Exception as e:
    conn.rollback()
    print("批量插入失败:", e)
finally:
    cursor.close()
    conn.close()

查询所有数据

python 复制代码
conn = pymysql.connect(**DB_CONFIG)
cursor = conn.cursor()

# 执行查询
cursor.execute("SELECT * FROM users")

# 1. 获取所有结果
all_data = cursor.fetchall()
print("所有数据:", all_data)

# 2. 获取单条结果
# one_data = cursor.fetchone()

# 3. 获取指定条数结果
# many_data = cursor.fetchmany(3)

# 遍历打印
for item in all_data:
    print(f"ID:{item[0]},姓名:{item[1]},年龄:{item[2]},性别:{item[3]}")

cursor.close()
conn.close()

条件查询

python 复制代码
conn = pymysql.connect(**DB_CONFIG)
cursor = conn.cursor()

# 条件查询:查询年龄>20的用户
sql = "SELECT * FROM users WHERE age > %s"
cursor.execute(sql, (20,))
result = cursor.fetchall()
print("年龄大于20的用户:", result)

cursor.close()
conn.close()
相关推荐
草莓熊Lotso21 小时前
Vibe Coding 时代:LangChain 与 LangGraph 全链路解析
linux·运维·服务器·数据库·人工智能·mysql·langchain
zh1570231 天前
JavaScript中WorkerThreads解决服务端计算瓶颈
jvm·数据库·python
代码AI弗森1 天前
一文理清楚“算力申请 / 成本测算 / 并发评估”
java·服务器·数据库
摇滚侠1 天前
expdp 查看帮助
java·数据库·oracle
流年似水~1 天前
MCP协议实战:从零搭建一个让Claude能“看见“数据库的工具服务
数据库·人工智能·程序人生·ai·ai编程
2401_871492851 天前
Vue.js监听器watch利用回调函数处理级联下拉框数据联动
jvm·数据库·python
志栋智能1 天前
超自动化安全:构建智能安全运营的核心引擎
大数据·运维·服务器·数据库·安全·自动化·产品运营
zhoutongsheng1 天前
C#怎么实现Swagger文档 C#如何在ASP.NET Core中集成Swagger自动生成API文档【框架】
jvm·数据库·python
WinterKay1 天前
【开源】我写了一个轻量级本地数据库浏览工具,支持 MySQL/Redis 只读查询
数据库·mysql·开源
zxrhhm1 天前
Oracle 索引完整指南
数据库·oracle