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


相关推荐
千枫s3 小时前
做一个电脑版爬虫程序
爬虫·python
大邳草民3 小时前
Python 对象模型与属性访问机制
开发语言·笔记·python
Rick19933 小时前
Redis 底层架构图
数据库·redis·缓存
weixin_402486343 小时前
小分子 pdb准化为sdf
python
橘子编程3 小时前
密码学完全指南:从基础到实战
java·python·密码学
蓝色的杯子3 小时前
Python面试30分钟突击掌握-LeetCode2-Strings
python
ZC跨境爬虫3 小时前
海南大学交友平台开发实战 day9(头像上传存入 SQLite+BLOB 存储 + 前后端联调避坑全记录)
前端·数据库·python·sqlite
FreakStudio3 小时前
嘉立创开源:应该是全网MicroPython教程最多的开发板
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy
上天_去_做颗惺星 EVE_BLUE3 小时前
接口自动化测试全流程:pytest 用例收集、并行执行、Allure 报告合并与上传
python·pytest