📘 Python读取JSON并插入MySQL数据库实训手册
一、实训目的
- ✅ 掌握 Python 读取
JSON格式文件的方法; - ✅ 学会使用
pymysql连接 MySQL 数据库; - ✅ 实现从 JSON 文件批量插入数据到本地 MySQL 数据库;
- ✅ 在本地创建新表(自动建表),理解数据库初始化流程;
- ✅ 提升综合编程能力,为后续数据处理、Web开发打下基础。
二、实训环境准备
1. 软件环境
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows / macOS / Linux |
| Python 版本 | 3.6 以上(推荐 3.8+) |
| MySQL 服务 | 5.7 或以上(本地运行) |
| 工具 | pymysql、json 模块、os 模块 |
2. 安装必备工具
打开终端或命令提示符,运行以下命令:
bash
pip install pymysql
🔹 确保 MySQL 服务已启动
🔹 本地 MySQL 用户名为
root,密码为root或你设置的密码
👉 验证 MySQL 是否运行:
bash
mysql -u root -p
# 输入密码后进入命令行
三、准备JSON数据文件
✅ 创建测试数据文件:books.json
创建一个名为 books.json 的文件,内容如下(可复制粘贴):
json
[
{
"book_name": "三体",
"author": "刘慈欣",
"publisher": "四川科学技术出版社",
"publish_date": "2008-03-01",
"price": 35.00,
"category": "科幻"
},
{
"book_name": "活着",
"author": "余华",
"publisher": "作家出版社",
"publish_date": "2005-01-01",
"price": 28.00,
"category": "小说"
},
{
"book_name": "百年孤独",
"author": "加西亚·马尔克斯",
"publisher": "南海出版公司",
"publish_date": "2011-08-01",
"price": 45.00,
"category": "魔幻现实主义"
},
{
"book_name": "追风筝的人",
"author": "卡勒德·胡赛尼",
"publisher": "上海人民出版社",
"publish_date": "2006-01-01",
"price": 38.00,
"category": "文学"
},
{
"book_name": "小王子",
"author": "安托万·德·圣-埃克苏佩里",
"publisher": "人民文学出版社",
"publish_date": "2012-05-01",
"price": 25.00,
"category": "童话"
}
]
📍 保存路径建议 :与 Python 脚本同目录,如:json_to_mysql/
四、实训项目结构建议
bash
json_to_mysql/
│
├── books.json # 数据文件
├── insert_books.py # 主程序:读JSON并插入数据库
├── create_table.py # 自动创建表(推荐先运行)
├── connection.py # 数据库连接模块(可选封装)
└── README.md # 说明文档
五、Python 实现代码
✅ 文件1:create_table.py ------ 自动创建数据库与表
python
# create_table.py
import pymysql
def create_table():
connection = None
try:
# 连接 MySQL(不指定数据库)
connection = pymysql.connect(
host='localhost',
user='root',
password='root', # ← 替换为你的实际密码
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
cursor = connection.cursor()
# 1. 创建数据库
db_name = "bookstore"
create_db_sql = f"CREATE DATABASE IF NOT EXISTS `{db_name}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
print("创建数据库...")
cursor.execute(create_db_sql)
connection.commit()
print(f"数据库 '{db_name}' 创建成功或已存在。")
# 2. 使用数据库
use_db_sql = f"USE `{db_name}`;"
print("切换到数据库...")
cursor.execute(use_db_sql)
connection.commit()
# 3. 创建表(书籍信息表)
create_table_sql = """
CREATE TABLE IF NOT EXISTS book_info (
id INT AUTO_INCREMENT PRIMARY KEY,
book_name VARCHAR(500) NOT NULL,
author VARCHAR(255),
publisher VARCHAR(255),
publish_date VARCHAR(50),
price DECIMAL(10,2),
category VARCHAR(100)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
"""
print("创建表 book_info...")
cursor.execute(create_table_sql)
connection.commit()
print("表 'book_info' 创建成功或已存在。")
print("\n表与数据库初始化完成!")
except Exception as e:
print(f"初始化失败:{e}")
if connection:
connection.rollback()
finally:
if connection:
connection.close()
print("连接已关闭。")
if __name__ == "__main__":
create_table()
✅ 文件2:insert_books.py ------ 读取 JSON 并批量插入
python
import json
import pymysql
# ======================
# 函数1:读取 JSON 文件
# ======================
def read_books_json():
try:
with open('books.json', 'r', encoding='utf-8') as f:
books_data = json.load(f)
print(f"成功读取 {len(books_data)} 条书籍数据")
return books_data
except FileNotFoundError:
print("错误:找不到 books.json 文件")
return None
except json.JSONDecodeError as e:
print(f"JSON解析失败:{e}")
return None
# ======================
# 函数2:连接数据库
# ======================
def connect_db():
try:
conn = pymysql.connect(
host='localhost',
user='root',
password='root', # 你的密码
database='bookstore', # 你的数据库
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
print("数据库连接成功")
return conn
except Exception as e:
print(f"数据库连接失败:{e}")
return None
# ======================
# 函数3:批量插入数据
# ======================
def insert_books(conn, books_data):
if not conn or not books_data:
print("数据或连接为空,无法插入")
return
cursor = conn.cursor()
insert_sql = """
INSERT INTO book_info (
book_name, author, publisher, publish_date, price, category
) VALUES (%s, %s, %s, %s, %s, %s)
"""
# 批量插入
for book in books_data:
try:
cursor.execute(insert_sql, (
book["book_name"],
book["author"],
book["publisher"],
book["publish_date"],
book["price"],
book["category"]
))
except Exception as e:
print(f"插入失败:{book['book_name']} | {e}")
conn.rollback()
conn.commit()
print(f"全部 {len(books_data)} 条数据插入完成!")
# ======================
# 主函数:按顺序调用3个函数
# ======================
if __name__ == "__main__":
# 1. 读JSON
books_data = read_books_json()
# 2. 连数据库
conn = connect_db()
# 3. 插入数据
if books_data and conn:
insert_books(conn, books_data)
# 4. 关闭连接
if conn:
conn.close()
print("数据库连接已关闭")
六、运行流程(必做步骤)
- ✅ 启动 MySQL 服务(确保运行中);
- ✅ 保存
books.json文件到项目目录; - ✅ 先运行
create_table.py(创建数据库+表); - ✅ 再运行
insert_books.py(插入数据); - ✅ 检查数据库是否成功!
七、验证结果(可选)
打开 MySQL 命令行,执行以下命令:
sql
USE bookstore;
SELECT * FROM book_info;
✅ 你应该能看到插入的 5 条数据。
八、常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
pymysql.err.OperationalError: (2003, "Can't connect") |
MySQL 未启动 | 启动 MySQL 服务(如:Windows 服务中启动 MySQL80) |
Access denied for user 'root'@'localhost' |
密码错误 | 检查 password='...' 是否写对,或重置 root 密码 |
FileNotFoundError: [Errno 2] No such file: 'books.json' |
文件不存在 | 确保文件在当前目录,且文件名拼写正确 |
Unknown database 'bookstore' |
未运行 create_table.py | 先运行 create_table.py |
UnicodeEncodeError: 'charmap' codec can't encode |
编码问题 | 确保 encoding='utf-8' 并使用 utf8mb4 |
九、拓展知识(可选加分项)
✅ 1. 使用 try-except 包裹每个数据插入,防止一条失败全失败
✅ 2. 添加"去重"逻辑(例如按 book_name 去重)
python
# 在插入前检查是否已存在
check_sql = "SELECT COUNT(*) FROM book_info WHERE book_name = %s"
cursor.execute(check_sql, (book['book_name'],))
if cursor.fetchone()[0] > 0:
print(f"⚠️ 跳过重复数据:{book['book_name']}")
continue
✅ 3. 输出日志信息(如:插入了多少条、耗时)
python
import time
start = time.time()
# ... 执行插入
print(f"⏱️ 插入耗时:{time.time() - start:.2f} 秒")
✅ 4. 用 SQLAlchemy 替代原生 SQL(进阶)
帮助理解 ORM 思想,为 Web 开发铺路。
十、实训总结与评分标准(教师可用)
| 项目 | 分值 | 说明 |
|---|---|---|
| 环境准备 | 10分 | Python、MySQL、pymysql 安装成功 |
| JSON读取 | 15分 | 成功读取并解析 JSON 文件 |
| 数据库连接 | 15分 | 成功连接 MySQL,用户名密码正确 |
| 创建表 | 20分 | 自动创建 bookstore 数据库和 book_info 表 |
| 批量插入 | 25分 | 成功插入所有数据,无报错 |
| 异常处理 | 10分 | 有合理的 try-except 保护 |
| 代码规范 | 5分 | 注释清晰,结构合理 |
✅ 总分:100
✅ 附录:快速入口
你只需依次运行:
bash
python create_table.py
python insert_books.py
✅ 无需手动登录 MySQL 输入 SQL,完全自动化!
💬 实训完成提示:
🎉 所有脚本成功运行,数据库中成功插入
books.json中的数据,无错误提示,即为实训完成!