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()
相关推荐
星星也在雾里6 小时前
PgBouncer 解决 PostgreSQL 连接数超限 + 可视化监控
数据库·postgresql
雨辰AI8 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城20248 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有9 小时前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
Mr. zhihao9 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
m0_748839499 小时前
利用天正暖通CAD快速掌握风管数量统计的方法
数据库
随身数智备忘录9 小时前
什么是设备管理体系?设备管理体系包含哪些核心模块?
网络·数据库·人工智能
海市公约10 小时前
MySQL更新语句执行全流程:从Buffer Pool修改到二阶段提交
数据库·mysql·binlog·innodb·undo log·二阶段提交·update执行原理
颂love10 小时前
MySQL的执行流程
android·数据库·mysql
程序leo源11 小时前
Qt窗口详解
开发语言·数据库·c++·qt·青少年编程·c#