Как разобрать вложенный файл данных json и вставить его в базу данных sqlite с помощью python3 - PullRequest
1 голос
/ 04 мая 2019

Я пытаюсь вставить данные из файла json в базу данных sqlite в python.

Формат файла 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.

Я хочу заполнить дополнительный столбец "activity_type" как "Note" для элемента, который имеет ключ "note", а другие как "ticket". Я запустил следующий код:

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 рядов. Требуемый вывод - только две строки - одна для заявки и другая для заметки.

Пожалуйста, найдите изображение базы данных прилагается. Пожалуйста, помогите мне исправить код. Пожалуйста, посоветуйте какой-нибудь другой лучший подход для решения этой проблемы. Заранее спасибо.

Database iamge

1 Ответ

1 голос
/ 04 мая 2019

Это 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 :

х в двухстороннем просмотре

Вернуть True, если x находится в ключах, значениях или элементах основного словаря (в последнем случае x должен быть кортежем (ключом, значением)).

...