python - 如何使用 python3 将更改的模式 json 插入到 mysql 中?
问题描述
我一直在使用 python 从 API 中提取数据,我从 api 获取的数据在嵌套的 json 中,所以当我第一次提取数据时,我得到它是这样的
{
"id":4657,
"type":"Media",
"custom_fields":{
"regarding":"await",
"cf_arc":"nodetails",
"cf_bbv":"nodetails",
"cf_mcp":null,
"cf_tte":"nodetails",
"cf_pod":"nodetails",
"cf_mod":null,
},
"createddate":"2019-10-17T09:59:30Z",
"updateddate":"2019-10-17T09:59:30Z",
}
如果您看到自定义字段是嵌套的 json,那么我想将这些嵌套的 json 放入每个字段的单列中。所以我展平了 json 并开始插入 mysql DB
def flatten_json(y):
out = {}
def flatten(x, name=''):
if type(x) is dict:
for a in x:
flatten(x[a], name + a + '_')
elif type(x) is list:
# i = 0
# for a in x:
# flatten(a, name + str(i) + '_')
# i += 1
out[name[:-1]] = str(x)
# print(x)
# out[name[:-1]] = x
# if len(x)==0:
# out[name[:-1]] = None
# else:
# out[name[:-1]] = x
else:
out[name[:-1]] = x
flatten(y)
return out
我的问题是 json 架构不断变化,列的顺序以及我得到 json 的东西
"createddate":"2019-10-17T09:59:30Z",
"custom_fields":{
"regarding":"await",
"cf_arc":"nodetails",
"cf_bbv":"nodetails",
"cf_mcp":null,
"cf_tte":"nodetails",
"cf_pod":"nodetails",
"cf_mod":null,
},
"type":"Media",
"updateddate":"2019-10-17T09:59:30Z",
}
列顺序已更改,因此当我展平 json 并尝试插入时出现错误。
我用谷歌搜索了同样的问题,但没有得到任何帮助,我正在使用 python3 和 pymysql 将数据插入 mysql。
任何帮助将不胜感激!
解决方案
您需要知道有效字段名称的集合,然后使用具有这些名称的列创建 TABLE。您可能会发现对数据进行两次传递很方便,可能会将其存储在临时文件中。第一遍查找字段名称并执行 CREATE TABLE,第二遍执行 INSERT。
如果您的表格列按字母顺序排序,您的问题会变得更加简单。
插入时,只需使用此表达式来构建您的值列表:
d = flatten_json(y)
vals = [d.get(col)
for col in sorted(table_column_names)]
请注意,如果其中一个 INSERT 缺少字段,.get()
则将默认为None
. 如果我们d[col]
改为使用,那么当行缺少字段时会引发致命错误,您可能会觉得这更可取。
编辑
要从字符串输入生成 mysql 时间戳,请使用str_to_date()
.
例如:str_to_date('2019-07-30T15:25:19Z', '%Y-%m-%dT%H:%i:%sZ')
推荐阅读
- java - 如何使用java在mysql服务器中插入年份数据类型
- django - 如何在 Django 中创建用于匿名投票的应用程序?
- google-cardboard - 谷歌纸板头部运动跟踪不起作用
- python - 如何使一列变成索引,另一列变成标题,其中 3 列是数据?
- java - 流元素是否已排序?
- css - 如何在 Firefox 中加载 css 样式并解决内容安全策略:问题?
- .htaccess - 使用 htaccess 阻止所有人,除了来自特定推荐人的访问者
- react-native - 在模态框外单击时关闭模态框
- c# - 将字节从控制器发送到 AJAX 响应以在视图上播放为 mp3
- javascript - 如何在数据库中保存换行符