Разбор json в операторы Insert с помощью Python

У меня есть файл, содержащий несколько записей json. Мне нужно проанализировать этот файл и загрузить каждый из json-файлов в определенную таблицу SQL-Server. Однако таблица может не существовать в базе данных, и в этом случае мне также нужно сначала создать ее перед загрузкой. Итак, мне нужно проанализировать файл json, выяснить поля / столбцы и создать таблицу. Затем мне нужно будет записать файлы jsons de-serialize в записи и вставить их в созданную таблицу. Однако предостережение заключается в том, что некоторые поля в json являются необязательными, т.е. поле может отсутствовать в одной записи json, но может присутствовать в другой записи. Ниже приведен пример файла с 3 записями: -

{ id : 1001, 
  name : "John", 
  age : 30 
} , 

{ id : 1002,
  name : "Peter",
  age : 25
},

{ id : 1002,
  name : "Kevin",
  age : 35,
  salary : 5000
},

Обратите внимание, что поле оплата труда появляется только в третьей записи. Результаты должны быть: -

CREATE TABLE tab ( id int, name varchar(100), age int, salary int );

INSERT INTO tab (id, name, age, salary) values (1001, 'John', 30, NULL)
INSERT INTO tab (id, name, age, salary) values (1002, 'Peter', 25, NULL)
INSERT INTO tab (id, name, age, salary) values (1003, 'Kevin', 35, 5000)

Может ли кто-нибудь помочь мне с некоторыми указателями, поскольку я новичок в Python. Спасибо.

Возможно, базы данных SQL - не лучший выбор. SQL требует фиксированной схемы.

Daniel 22.08.2018 23:52

Просто предупредите, что ваш пример файла JSON не является допустимым JSON. Вам нужно будет заключить весь файл в квадратные скобки, а также заключить ваши ключи в двойные кавычки.

Jon Warren 22.08.2018 23:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
8 613
2

Ответы 2

В Python вы можете сделать что-то подобное, используя sqlite3 и json, оба из стандартной библиотеки.

import json
import sqlite3

# The string representing the json.
# You will probably want to read this string in from
# a file rather than hardcoding it.
s = """[
    {
        "id": 1001, 
        "name": "John", 
        "age" : 30 
    }, 
    {
        "id" : 1002,
        "name" : "Peter",
        "age" : 25
    },
    {
        "id" : 1002,
        "name" : "Kevin",
        "age" : 35,
        "salary" : 5000
    }
]"""

# Read the string representing json
# Into a python list of dicts.
data = json.loads(s)


# Open the file containing the SQL database.
with sqlite3.connect("filename.db") as conn:

    # Create the table if it doesn't exist.
    conn.execute(
        """CREATE TABLE IF NOT EXISTS tab(
                id int,
                name varchar(100),
                age int,
                salary int
            );"""
        )

    # Insert each entry from json into the table.
    keys = ["id", "name", "age", "salary"]
    for entry in data:

        # This will make sure that each key will default to None
        # if the key doesn't exist in the json entry.
        values = [entry.get(key, None) for key in keys]

        # Execute the command and replace '?' with the each value
        # in 'values'. DO NOT build a string and replace manually.
        # the sqlite3 library will handle non safe strings by doing this.
        cmd = """INSERT INTO tab VALUES(
                    ?,
                    ?,
                    ?,
                    ?
                );"""
        conn.execute(cmd, values)

    conn.commit()

Это создаст файл с именем filename.db в текущем каталоге со вставленными записями.

Чтобы проверить таблицы:

# Testing the table.
with sqlite3.connect("filename.db") as conn:
    cmd = """SELECT * FROM tab WHERE SALARY NOT NULL;"""
    cur = conn.execute(cmd)
    res = cur.fetchall()
    for r in res:
        print(r)

Вы можете попробовать это:

import json

TABLE_NAME = "tab"

sqlstatement = ''
with open ('data.json','r') as f:
    jsondata = json.loads(f.read())

for json in jsondata:
    keylist = "("
    valuelist = "("
    firstPair = True
    for key, value in json.items():
        if not firstPair:
            keylist += ", "
            valuelist += ", "
        firstPair = False
        keylist += key
        if type(value) in (str, unicode):
            valuelist += "'" + value + "'"
        else:
            valuelist += str(value)
    keylist += ")"
    valuelist += ")"

    sqlstatement += "INSERT INTO " + TABLE_NAME + " " + keylist + " VALUES " + valuelist + "\n"

print(sqlstatement)

Однако, чтобы это сработало, вам нужно изменить файл JSON, чтобы исправить синтаксис следующим образом:

[{  
    "id" : 1001, 
    "name" : "John", 
    "age" : 30 
} , 

{   
    "id" : 1002,
    "name" : "Peter",
    "age" : 25
},

{
    "id" : 1003,
    "name" : "Kevin",
    "age" : 35,
    "salary" : 5000
}]

Выполнение этого дает следующий результат:

INSERT INTO tab (age, id, name) VALUES (30, 1001, 'John')
INSERT INTO tab (age, id, name) VALUES (25, 1002, 'Peter')
INSERT INTO tab (salary, age, id, name) VALUES (5000, 35, 1003, 'Kevin')

Обратите внимание, что вам не нужно указывать NULL. Если вы не укажете столбец в операторе вставки, он должен автоматически вставить NULL в любые столбцы, которые вы пропустили.

Большое спасибо @Jon Warren. Сработало как шарм ... это именно то, что мне было нужно. Также узнал много нового. Еще раз спасибо.

Matthew 23.08.2018 17:23

Другие вопросы по теме