如何使用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
相关产品推荐
相关产品推荐

