json - 如何使用python3解析嵌套的json数据文件并将其插入sqlite数据库
问题描述
我正在尝试将 json 文件中的数据插入 python 中的 sqlite 数据库。
json文件格式为:
{
"metadata": {
"start_at": "2016-01-27 20:01:14",
"end_at": "2016-08-23 20:01:14",
"act_count": 1
},
"act_data": [{
"performed_at": "2013-04-24 20:01:14",
"ticket_id": 531,
"performer_type": "user",
"performer_id": 7687,
"activity": {
"shipping_address": "N/A",
"priority": 3,
"agent_id": 8505,
"requester": 12559
}
}, {
"performed_at": "2012-03-14 20:01:14.340099",
"ticket_id": 235,
"performer_type": "user",
"performer_id": 11829,
"activity": {
"note": {
"id": 22257,
"type": 1
}
}
}]
}
我想将所有列插入到同一个表中。我已经在 sqlite 数据库中创建了一个表。
我想为具有“note”键和其他“ticket”的项目填充一个附加列“activity_type”作为“Note”。我运行了以下代码:
import json
import sqlite3
with open("tickets1.json") as data_file:
data = json.load(data_file)
conn = sqlite3.connect('tickets.db')
c = conn.cursor()
c.execute(""" CREATE TABLE activitydata1(
performed_at VARCHAR(50) NOT NULL,
ticket_id INTEGER NOT NULL,
performed_type VARCHAR(10) NOT NULL ,
performer_id INTEGER NOT NULL,
acitivity_type VARCHAR(10) NOT NULL,
note_id INTEGER NULL,
note_type INTEGER NULL,
shipping_address NVARCHAR(50) NULL,
shipment_date NVARCHAR(50) NULL,
category VARCHAR(10) NULL,
contacted_customer VARCHAR(10) NULL,
issue_type VARCHAR(10) NULL,
source INTEGER NULL,
status VARCHAR(10) NULL,
priority INTEGER NULL,
groups VARCHAR(10) NULL,
agent_id INTEGER NULL,
requester INTEGER NULL,
product VARCHAR(10) NULL)
""")
for record in data["act_data"]:
for key,val in record["activity"].items():
if ( key == 'note'):
activity_type="note"
c.execute("INSERT INTO activitydata1(performed_at, ticket_id,performed_type,performer_id,acitivity_type,note_id,note_type) VALUES (?,?,?,?,?,?,?)",(record["performed_at"], record["ticket_id"],record["performer_type"],record["performer_id"],activity_type,val["id"],val["type"]))
else:
activity_type="ticket"
c.execute("INSERT INTO activitydata1(performed_at, ticket_id,performed_type,performer_id,acitivity_type,shipping_address,priority,agent_id,requester) VALUES (?,?,?,?,?,?,?,?,?)",(record["performed_at"], record["ticket_id"],record["performer_type"],record["performer_id"],activity_type,record["activity"]["shipping_address"],record["activity"]["priority"],record["activity"]["agent_id"],record["activity"]["requester"]))
conn.commit()
conn.close()
此代码插入四行同一张票和一行票据。一共5行。所需的输出只有两行 - 一行用于票据,另一行用于票据。
请找到所附数据库的图像。请帮我更正代码。请建议一些其他更好的方法来处理这个问题。提前致谢。
解决方案
这for key,val in record["activity"].items():
将执行 4 次,因为这
"activity": {
"shipping_address": "N/A",
"priority": 3,
"agent_id": 8505,
"requester": 12559
}
有四个项目。
也许你只需要类似的东西
if "note" in record["activity"]:
# do the notes thing
else:
# do the other thing
来自python 文档:
dictview中的x
如果 x 在底层字典的键、值或项中,则返回 True(在后一种情况下,x 应该是 (key, value) 元组)。
推荐阅读
- javascript - 使用 joi.assert 或 joi.attempt 时出现“TypeError:schema.validate 不是函数”
- javascript - 条件格式运行正常
- c++ - QT:断言:文件 C:\Qt\Qt5.14.2\5.14.2\mingw73_64\include/QtCore/qstring.h 中的“uint(i) < uint(size())”,第 1029 行
- c# - 从 url 或没有随机写入行
- python - 在编译这个贪婪算法的 python 问题时遇到问题
- kotlin - 当实体字段在 Kotlin 类中可以为空时,是否可以使 Room SQLite 列不为空?
- python - 在 Python 中合并图像
- reactjs - 媒体查询在检查员中有效,但在手机上无效
- tensorflow - 具有多个隐藏层的 TensorFlow 2 GRU 层
- reactjs - React-Select isMulti 检索选择的选项