环境准备
bash
pip3 install pymysql
前提条件
- 本地 / 远程已安装 MySQL 服务
- 拥有 MySQL 数据库的连接信息(主机、端口、用户名、密码、数据库名)
- 确保 MySQL 服务正常运行,且网络可访问
操作流程
Python 操作 MySQL 固定 5 步:
- 建立数据库连接
- 创建游标对象(执行 SQL 的工具)
- 执行 SQL 语句
- 提交事务(写操作必须)/ 获取查询结果
- 关闭游标 + 关闭连接
重要规范
- 所有写操作(INSERT/UPDATE/DELETE)必须用
commit()提交,否则数据不会生效 - 必须使用 % s 占位符,不要用字符串拼接,防止 SQL 注入
- 操作完成后必须关闭游标和连接,释放资源
- 用
try-except-finally保证异常时数据安全
常见问题
- 连接失败:检查主机、端口、用户名、密码、数据库名是否正确
- 数据不生效 :忘记写
conn.commit() - 中文乱码 :字符集设置为
utf8mb4 - SQL 报错:检查 SQL 语法,优先使用占位符传参
必须掌握的关键字
connect():建立数据库连接cursor():创建游标(执行 SQL 的核心对象)execute():执行单条 SQLexecutemany():执行批量 SQLcommit():提交事务(增 / 删 / 改必须调用)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()