实训7 json文件数据用python导入数据库

📘 Python读取JSON并插入MySQL数据库实训手册


一、实训目的

  1. ✅ 掌握 Python 读取 JSON 格式文件的方法;
  2. ✅ 学会使用 pymysql 连接 MySQL 数据库;
  3. ✅ 实现从 JSON 文件批量插入数据到本地 MySQL 数据库;
  4. ✅ 在本地创建新表(自动建表),理解数据库初始化流程;
  5. ✅ 提升综合编程能力,为后续数据处理、Web开发打下基础。

二、实训环境准备

1. 软件环境

项目 要求
操作系统 Windows / macOS / Linux
Python 版本 3.6 以上(推荐 3.8+)
MySQL 服务 5.7 或以上(本地运行)
工具 pymysqljson 模块、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("数据库连接已关闭")

六、运行流程(必做步骤)

  1. ✅ 启动 MySQL 服务(确保运行中);
  2. ✅ 保存 books.json 文件到项目目录;
  3. ✅ 先运行 create_table.py(创建数据库+表);
  4. ✅ 再运行 insert_books.py(插入数据);
  5. ✅ 检查数据库是否成功!

七、验证结果(可选)

打开 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 中的数据,无错误提示,即为实训完成!


相关推荐
Elastic 中国社区官方博客5 分钟前
Elastic 线下 Meetup 将于 2026 年 7 月 26 号下午在深圳举行
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
独隅9 分钟前
PyTorch自动微分模块:从原理到实战一
人工智能·pytorch·python
YL2004042615 分钟前
【Redis实战篇】秒杀实现方案(以优惠券秒杀为例)
数据库·redis
DIY源码阁21 分钟前
JavaSwing宿舍管理系统 - MySQL版
java·数据库·mysql·eclipse
cfm_291427 分钟前
MySQL8.0 InnoDB Cluster
数据库·mysql
kTR2hD1qb37 分钟前
Claude Code Skill的介绍与使用
java·前端·数据库·人工智能
汤米粥1 小时前
python学习——核心语法三
java·python·学习
一 乐1 小时前
汽车租赁|基于SprinBoot+vue的汽车租赁管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·汽车·论文·毕设·汽车租赁管理系统
zandy10111 小时前
衡石科技 NL2Metrics 技术深度解析(2026):ChatBI 准确度破局的关键路径
数据库·科技·oracle