【问题标题】:How to parse a nested json data file iand insert it into sqlite database using python3如何使用python3解析嵌套的json数据文件并将其插入sqlite数据库
【发布时间】:2019-09-22 12:03:39
【问题描述】:

我正在尝试将 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行。 所需的输出只有两行 - 一行用于票据,另一行用于备注。

请找到所附数据库的图像。 请帮我更正代码。 请建议一些其他更好的方法来处理这个问题。 提前致谢。

【问题讨论】:

  • 您能否包括您的表定义以及在该 json 中插入值后您希望结果行的样子?
  • @Shawn 我已经用数据库的表定义和图像更新了问题。感谢您的帮助。

标签: json python-3.x parsing sqlite insert


【解决方案1】:

这个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 doc

dictview 中的 x

如果 x 在底层字典的键、值或项中,则返回 True(在后一种情况下,x 应该是 (key, value) 元组)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 2021-10-29
    • 2010-12-17
    • 2019-12-09
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多