Python x MySQL

数据结构化与持久化实战


🎯 本节课目标

  • 任务 A: 用 Python 连接 MySQL 并创建数据库
  • 任务 B: 用 Python 编写 SQL,创建数据表
  • 任务 C: 挑战高级操作:列表数据的批量插入
  • 任务 D: 条件查询,并把结果打印到控制台

📖 教学背景场景

假设我们刚刚写完一个爬虫,从网上抓取了一批“畅销编程图书”的数据。

这些数据目前存在内存里(Python 列表),一旦关机就没了。


目标:将这些图书数据永久保存到 MySQL 中,并能随时查询。

⚙️ 课前准备

在开始写代码前,我们需要一个“桥梁”让 Python 能和 MySQL 对话。

打开终端 (Terminal / CMD),安装 pymysql 库:


                                                        pip install pymysql
                                                    

* 注:本教程以 pymysql 为例,这是最轻量且广泛使用的纯 Python MySQL 客户端库。

🔗 第一步:建立基础连接

导入库,配置你的 MySQL 账号和密码:


                                                    import pymysql
                
                                                    # 1. 建立基础连接 (此时还不指定具体的数据库)
                                                    conn = pymysql.connect(
                                                        host='localhost',    # 数据库主机地址
                                                        user='root',         # 你的数据库用户名
                                                        password='password', # 你的数据库密码
                                                        charset='utf8mb4'    # 支持中文和 Emoji 的编码
                                                    )
                
                                                    # 2. 获取游标 (Cursor) - 它是帮我们执行 SQL 语句的“跑腿员”
                                                    cursor = conn.cursor()
                                                    

🔨 任务 A:创建名为 library_db 的数据库

如果数据库已经存在怎么办?我们可以用 IF NOT EXISTS 语法防止报错。


                                                    # 执行建库 SQL
                                                    cursor.execute("CREATE DATABASE IF NOT EXISTS library_db")
                
                                                    print("数据库 library_db 创建成功或已存在!")
                                                    

🚪 切换到目标数据库

库建好了,我们需要“进入”这个库,才能在里面建表。


                                                    # 告诉系统,接下来的操作都在 library_db 里面进行
                                                    cursor.execute("USE library_db")
                                                    

(相当于在控制台里输入了 use library_db;)

📋 任务 B:设计表结构

我们需要一张 books(图书)表,包含以下字段:

字段名 数据类型 说明
idINT主键,自增(自动编号)
titleVARCHAR(50)书名
authorVARCHAR(30)作者
priceDECIMAL(6,2)价格(保留两位小数)

📝 任务 B:执行建表代码

利用 Python 多行字符串 编写清晰的 SQL:


                                                    create_table_sql = """
                                                    CREATE TABLE IF NOT EXISTS books (
                                                        id INT AUTO_INCREMENT PRIMARY KEY,
                                                        title VARCHAR(50) NOT NULL,
                                                        author VARCHAR(30),
                                                        price DECIMAL(6,2)
                                                    )
                                                    """
                
                                                    # 让跑腿员执行建表指令
                                                    cursor.execute(create_table_sql)
                                                    print("数据表 books 准备就绪!")
                                                    

📦 任务 C:我们爬取到的数据

假设经过爬虫提取,我们得到了一个包含多个元组的 列表 (List)


                                                    data = [
                                                        ('Python Crash Course', 'Eric Matthes', 89.50),
                                                        ('Clean Code', 'Robert C. Martin', 115.00),
                                                        ('The Pragmatic Programmer', 'Andrew Hunt', 99.00),
                                                        ('Design Patterns', 'GoF', 120.80)
                                                    ]
                                                    

思考:如果有一万条数据,用 `for` 循环一条一条插入会怎样?

🚀 秘密武器:executemany()

用循环单条插入速度慢、效率低。

Python 提供了 cursor.executemany(),可以一次性批量执行多条数据!


SQL 语句中的数据我们用 %s 作为占位符。

📥 任务 C:执行批量插入


                                                    # SQL 模板,三个 %s 代表后面的 title, author, price
                                                    insert_sql = "INSERT INTO books (title, author, price) VALUES (%s, %s, %s)"
                
                                                    # 传入 SQL 模板和整个列表,自动完成批量映射
                                                    cursor.executemany(insert_sql, data)
                
                                                    # 【极其重要】插入、修改、删除操作,必须执行 commit() 提交事务
                                                    conn.commit()
                                                    print(f"成功插入了 {cursor.rowcount} 条图书数据!")
                                                    

⚠️ 新手最常犯的错:忘记写 conn.commit(),导致代码不报错,但数据库里啥也没有!

🔍 任务 D:根据条件查询数据

老板提需求了:
“帮我把所有价格超过 100 元的书名和作者查出来!”


SQL 怎么写?


                                                        SELECT title, author, price FROM books WHERE price > 100;
                                                    

💻 任务 D:Python 查询实操


                                                    query_sql = "SELECT title, author, price FROM books WHERE price > 100"
                                                    cursor.execute(query_sql)
                
                                                    # 获取所有查询结果 (返回的是元组的元组)
                                                    results = cursor.fetchall()
                
                                                    print("--- 价格大于 100 元的图书 ---")
                                                    for row in results:
                                                        print(f"书名: {row[0]}, 作者: {row[1]}, 价格: ¥{row[2]}")
                                                    

Tip: 也可以用 fetchone() 每次只取一条数据。

🚪 良好习惯:关闭连接

用完数据库后,千万别忘了把“门”关上,释放系统资源。


                                                    # 先关游标
                                                    cursor.close()
                
                                                    # 再关连接
                                                    conn.close()
                
                                                    print("数据库连接已安全关闭。")
                                                    

📜 完整代码总览


                                    import pymysql
                
                                    # 1. 连接数据库并获取游标
                                    conn = pymysql.connect(host='localhost', user='root', password='password')
                                    cursor = conn.cursor()
                
                                    # 2. 建库并进入
                                    cursor.execute("CREATE DATABASE IF NOT EXISTS library_db")
                                    cursor.execute("USE library_db")
                
                                    # 3. 建表
                                    cursor.execute("""
                                    CREATE TABLE IF NOT EXISTS books (
                                        id INT AUTO_INCREMENT PRIMARY KEY,
                                        title VARCHAR(50), author VARCHAR(30), price DECIMAL(6,2)
                                    )""")
                                                    

📜 完整代码总览 (续)


                                    # 4. 准备数据并批量插入
                                    data = [
                                        ('Python Crash Course', 'Eric Matthes', 89.50),
                                        ('Clean Code', 'Robert C. Martin', 115.00),
                                        ('The Pragmatic Programmer', 'Andrew Hunt', 99.00),
                                        ('Design Patterns', 'GoF', 120.80)
                                    ]
                                    cursor.executemany("INSERT INTO books (title, author, price) VALUES (%s, %s, %s)", data)
                                    conn.commit() # 务必提交!
                
                                    # 5. 条件查询
                                    cursor.execute("SELECT title, price FROM books WHERE price > 100")
                                    for row in cursor.fetchall():
                                        print(f"书名: {row[0]}, 价格: ¥{row[1]}")
                
                                    # 6. 关闭连接
                                    cursor.close()
                                    conn.close()
                                                    

⚔️ 课后作业


  • A:创建数据库:ecommerce_db
  • B:创建表 phones (id, brand, price, stock)
  • C:使用 executemany() 批量插入:
    [('Apple', 7999, 100), ('Huawei', 6999, 200), ('Xiaomi', 3999, 500)]
  • D:查询并打印价格 大于 5000 的手机品牌!

❓ Q & A 时间

如果在执行过程中遇到报错:

  • 1. 检查 MySQL 服务是否已启动?
  • 2. 检查 root 密码是否填错?
  • 3. 是否漏写了 conn.commit()