实训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 或以上(本地运行)
工具 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("数据库连接已关闭")

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

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


相关推荐
Decay__2 小时前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构
eggwyw2 小时前
Anaconda安装卸载的详细流程指南
开发语言·python
2601_967979122 小时前
纯手写:Python安装pip完整教程,搞了几小时,终于成功
python·教程·pip·安装·包管理
Norna2 小时前
缓存文件从没写出来:一个 .json 被当成目录用了
python
笃行3503 小时前
【金仓数据库产品体验官】订单增量同步实战:MERGE、OUTPUT 与 IDENTITY 的兼容验证
数据库
aifannihao5 小时前
AI 学习第 14 课:CNN 训 6 轮卡在 0.5352,数据没打乱
pytorch·python·深度学习·cnn·学习路线
yuyuxun15 小时前
协同过滤的校园二手物品智能推荐系统的设计与实现 毕业设计-附源码40082
javascript·vue.js·spring boot·python·数据分析·django·课程设计
如夏倾城6 小时前
百度文心(容易被忽略的好用AI)使用方式
人工智能·python·百度·语言模型·dubbo
用户019027581616 小时前
quotes 实时价和 klines 最新收盘价为什么对不上?
python
星恒随风6 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql