You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python将API返回的数据批量存储到MySQL数据库

解决方法

你现在的核心问题有两个:一是noncompliant_data存的是接口返回的原始文本字符串,还没转成可批量处理的结构化数据;二是逐行手写INSERT语句效率极低,直接用数据库驱动自带的批量插入方法即可,不需要手动逐行拼接SQL。

第一步:先解析接口返回的结构化数据

绝大多数API返回的都是JSON格式,你当前赋值的response.text是纯文本,先转成Python可处理的列表/字典结构:

# 替换原有的 noncompliant_data = response.text
noncompliant_data = response.json()

注意:如果你的接口返回的不是JSON格式(比如CSV、XML),先对应解析成「元素为字典的列表」结构即可,列表里每个字典对应一行待存储的数据,字典的键对应MySQL表的字段名。

第二步:提前确认MySQL表结构

先确保本地数据库已经建好对应存储的表,举个例子,假设你要存的违规数据包含record_id(整型)、violation_content(字符串)、violation_date(日期)三个字段,参考建表语句如下,你可以根据自己的实际字段调整:

CREATE TABLE IF NOT EXISTS noncompliant_records (
    record_id INT PRIMARY KEY,
    violation_content VARCHAR(1000) NOT NULL,
    violation_date DATE NOT NULL
);

第三步:用executemany实现批量插入

不要手动逐行拼接INSERT语句,mysql.connector自带的executemany方法专门适配批量写入场景,上百行甚至上万行数据的写入效率都很高,同时用参数化查询可以避免SQL注入,也不需要手动处理特殊字符转义。
完整修改后的可运行代码如下:

import requests
import mysql.connector
from mysql.connector import Error

# 拉取接口数据
response = requests.get("redactedAPIURL")
# 解析JSON为结构化数据,正常情况下noncompliant_data是列表,每个元素对应一行数据
noncompliant_data = response.json()

try:
    # 建立数据库连接
    connection = mysql.connector.connect(
        host="localhost",
        user="root",
        passwd="mypassword",
        database="database_name"
    )
    
    if connection.is_connected():
        cursor = connection.cursor()
        # 写INSERT模板,%s是参数占位符,数量和待插入字段数保持一致
        insert_query = """
        INSERT INTO noncompliant_records (record_id, violation_content, violation_date)
        VALUES (%s, %s, %s)
        """
        # 把结构化数据转成元组列表,每个元组对应一行插入值,顺序和上面INSERT的字段顺序严格对应
        records_to_insert = [
            (item["record_id"], item["violation_content"], item["violation_date"])
            for item in noncompliant_data
        ]
        # 执行批量插入
        cursor.executemany(insert_query, records_to_insert)
        # 提交事务,这步不能漏,否则数据不会真正写入数据库
        connection.commit()
        print(f"成功插入{cursor.rowcount}条数据")

except Error as e:
    print(f"数据库操作出错: {e}")
    # 操作出错时回滚事务
    if connection.is_connected():
        connection.rollback()

finally:
    # 操作结束后无论成功失败都关闭游标和连接
    if connection.is_connected():
        cursor.close()
        connection.close()
        print("数据库连接已关闭")

新手容易踩的坑

  • INSERT语句里的参数占位符不管对应字段是什么数据类型,统一写%s,不要手动给占位符加引号,驱动会自动处理类型匹配、特殊字符转义
  • 构造插入值元组时,值的顺序必须和INSERT语句里写的字段顺序完全对应,否则会出现字段存错、类型不匹配的报错
  • 执行完executemany之后一定要调用connection.commit(),mysql-connector默认开启事务,不提交的话连接关闭后写入的数据会直接丢失
  • 如果调用response.json()后得到的noncompliant_data不是多行数据组成的列表,先打印结构找到实际存储数据的列表字段即可,比如不少接口返回格式是{"code":200, "msg":"success", "data":[实际数据列表]},这种情况取response.json()["data"]作为待插入数据集就行

内容的提问来源于stack exchange,提问作者ncd96

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 19:24:31