Skip to content

Python操作MySQL

学会 SQL 之后,下一步就是让 Python 程序真正去连接 MySQL。

只有走到这一步,你才算把“数据库知识”真正带进项目开发里。

本节目标

  • 学会安装 Python 的 MySQL 连接库
  • 学会建立数据库连接
  • 学会创建游标并执行 SQL
  • 学会查询、插入、修改、删除数据
  • 理解 commit()、参数化 SQL 和异常处理的重要性

为什么要让 Python 连接 MySQL

因为真实项目里,数据库不会靠你手动打开客户端一条条敲 SQL。

真正的流程通常是:

  • Python 程序接收用户请求
  • Python 程序操作数据库
  • Python 程序把结果返回页面或接口

所以 Python 连接数据库,是开发能力中的关键环节。

安装连接库

最常见的库之一是 pymysql

bash
pip install pymysql

安装完成后,就可以在 Python 中导入并使用它。

一次数据库操作的完整流程

你可以把一次操作理解成四步:

  1. 建立连接
  2. 创建游标
  3. 执行 SQL
  4. 获取结果并关闭连接

第一个查询示例

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 的很多底层直觉也会更容易建立起来。

Built with VitePress.