首页 > 解决方案 > 如何使用 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。

任何帮助将不胜感激!

标签: pythonmysqljsonpython-3.xapi

解决方案


您需要知道有效字段名称的集合,然后使用具有这些名称的列创建 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')


推荐阅读