Python操作MySQL
学会 SQL 之后,下一步就是让 Python 程序真正去连接 MySQL。
只有走到这一步,你才算把“数据库知识”真正带进项目开发里。
本节目标
- 学会安装 Python 的 MySQL 连接库
- 学会建立数据库连接
- 学会创建游标并执行 SQL
- 学会查询、插入、修改、删除数据
- 理解
commit()、参数化 SQL 和异常处理的重要性
为什么要让 Python 连接 MySQL
因为真实项目里,数据库不会靠你手动打开客户端一条条敲 SQL。
真正的流程通常是:
- Python 程序接收用户请求
- Python 程序操作数据库
- Python 程序把结果返回页面或接口
所以 Python 连接数据库,是开发能力中的关键环节。
安装连接库
最常见的库之一是 pymysql。
bash
pip install pymysql安装完成后,就可以在 Python 中导入并使用它。
一次数据库操作的完整流程
你可以把一次操作理解成四步:
- 建立连接
- 创建游标
- 执行 SQL
- 获取结果并关闭连接
第一个查询示例
python
import pymysql
conn = pymysql.connect(
host="127.0.0.1",
user="root",
password="123456",
database="study_db",
charset="utf8mb4"
)
cursor = conn.cursor()
cursor.execute("SELECT id, name, age FROM students")
rows = cursor.fetchall()
for row in rows:
print(row)
cursor.close()
conn.close()如果表里有两条数据,输出可能是:
text
(1, '小明', 18)
(2, '小红', 19)逐步理解上面这段代码
pymysql.connect(...)
表示建立数据库连接。
conn.cursor()
创建游标。
你可以把游标理解成:
- 执行 SQL 和拿结果的操作句柄
cursor.execute(...)
执行一条 SQL 语句。
fetchall()
取出全部结果。
close()
关闭游标和连接,避免资源浪费。
插入数据
python
import pymysql
conn = pymysql.connect(
host="127.0.0.1",
user="root",
password="123456",
database="study_db",
charset="utf8mb4"
)
cursor = conn.cursor()
sql = "INSERT INTO students (name, age, city) VALUES (%s, %s, %s)"
cursor.execute(sql, ("小刚", 20, "广州"))
conn.commit()
cursor.close()
conn.close()这里最关键的一步是:
python
conn.commit()如果没有提交,插入结果通常不会真正写入数据库。
修改数据
python
sql = "UPDATE students SET city=%s WHERE name=%s"
cursor.execute(sql, ("深圳", "小刚"))
conn.commit()这表示:
- 找到名字是“小刚”的学生
- 把城市更新为“深圳”
删除数据
python
sql = "DELETE FROM students WHERE name=%s"
cursor.execute(sql, ("小刚",))
conn.commit()注意单个参数的元组写法:
python
("小刚",)逗号不能省略。
查询一条和查询全部
fetchone()
表示取一条结果。
python
cursor.execute("SELECT name FROM students WHERE id=1")
row = cursor.fetchone()
print(row)fetchall()
表示取全部结果。
python
cursor.execute("SELECT name FROM students")
rows = cursor.fetchall()
print(rows)为什么一定要用参数化 SQL
不要这样写:
python
name = "小明"
sql = f"SELECT * FROM students WHERE name = '{name}'"
cursor.execute(sql)这种写法有 SQL 注入风险。
更安全的写法是:
python
sql = "SELECT * FROM students WHERE name = %s"
cursor.execute(sql, ("小明",))这就是参数化 SQL。
它的意义不只是“语法更规范”,更重要的是安全性更高。
一个完整增删改查示例
python
import pymysql
conn = pymysql.connect(
host="127.0.0.1",
user="root",
password="123456",
database="study_db",
charset="utf8mb4"
)
cursor = conn.cursor()
# 新增
cursor.execute(
"INSERT INTO students (name, age, city) VALUES (%s, %s, %s)",
("小王", 21, "杭州")
)
conn.commit()
# 查询
cursor.execute("SELECT id, name, city FROM students WHERE name=%s", ("小王",))
print(cursor.fetchone())
# 修改
cursor.execute(
"UPDATE students SET city=%s WHERE name=%s",
("南京", "小王")
)
conn.commit()
# 删除
cursor.execute("DELETE FROM students WHERE name=%s", ("小王",))
conn.commit()
cursor.close()
conn.close()这个例子已经把 Python 操作 MySQL 的完整闭环串起来了。
异常处理
数据库操作也会出错,例如:
- 数据库没启动
- 用户名密码不对
- SQL 写错
所以最好逐步学会加异常处理。
python
import pymysql
try:
conn = pymysql.connect(
host="127.0.0.1",
user="root",
password="123456",
database="study_db",
charset="utf8mb4"
)
cursor = conn.cursor()
cursor.execute("SELECT * FROM students")
print(cursor.fetchall())
except Exception as e:
print("数据库操作失败:", e)
finally:
try:
cursor.close()
conn.close()
except:
pass常见错误
1. 连接失败
常见原因:
- MySQL 服务没启动
- 用户名密码错误
- 数据库名写错
2. 中文乱码
连接时通常建议写:
python
charset="utf8mb4"3. 插入了数据却查不到
很可能是忘了:
python
conn.commit()4. 单参数元组少了逗号
例如:
python
("小刚")这不是元组,而只是字符串。
练习题
练习 1
用 Python 连接你的 MySQL 数据库。
练习 2
查询 students 表中的全部数据。
练习 3
插入一条新学生数据,并提交。
练习 4
用参数化 SQL 按姓名查询一条记录。
练习 5
自己总结:
- 连接、游标、执行、取结果、关闭,这几个步骤分别在做什么
本节小结
这一节最重要的,是把 Python 和 MySQL 真正连接起来。
你最重要的收获应该是:
- 会建立连接
- 会创建游标
- 会执行最基础的增删改查
- 知道为什么
commit()很关键 - 理解参数化 SQL 的安全意义
只要这一步打通,后面 Django ORM 的很多底层直觉也会更容易建立起来。