假设我们刚刚写完一个爬虫,从网上抓取了一批“畅销编程图书”的数据。
这些数据目前存在内存里(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()
如果数据库已经存在怎么办?我们可以用 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;)
我们需要一张 books(图书)表,包含以下字段:
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| id | INT | 主键,自增(自动编号) |
| title | VARCHAR(50) | 书名 |
| author | VARCHAR(30) | 作者 |
| price | DECIMAL(6,2) | 价格(保留两位小数) |
利用 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 准备就绪!")
假设经过爬虫提取,我们得到了一个包含多个元组的 列表 (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` 循环一条一条插入会怎样?
用循环单条插入速度慢、效率低。
Python 提供了 cursor.executemany(),可以一次性批量执行多条数据!
SQL 语句中的数据我们用 %s 作为占位符。
# 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(),导致代码不报错,但数据库里啥也没有!
老板提需求了:
“帮我把所有价格超过 100 元的书名和作者查出来!”
SQL 怎么写?
SELECT title, author, price FROM books WHERE price > 100;
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()
ecommerce_dbphones (id, brand, price, stock)executemany() 批量插入:[('Apple', 7999, 100), ('Huawei', 6999, 200), ('Xiaomi', 3999, 500)]如果在执行过程中遇到报错:
root 密码是否填错?conn.commit()?