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()
相关推荐
VIV-2 小时前
医院病房管理系统的数据库设计(SQL Server)
数据库·sql·sqlserver
荒川之神2 小时前
Oracle 数据仓库星型模型设计原则
数据库·数据仓库·oracle
Chasing__Dreams2 小时前
Mysql--基础知识点--96--count * VS count 列
数据库·mysql
老仙儿2 小时前
Room数据库框架的使用
数据库
一个有温度的技术博主2 小时前
深入多级缓存:JVM进程缓存实战与数据库表拆分策略
jvm·数据库·缓存
jnrjian2 小时前
Oracle Text 安装
数据库·oracle
荒川之神2 小时前
ORACLE 12C/19C 手工建立多租户数据库
数据库·oracle
a里啊里啊3 小时前
常见面试题目集合
linux·数据库·c++·面试·职场和发展·操作系统
北有树3 小时前
Redis专题面试题总结
数据库·redis·缓存