У меня есть файл, содержащий несколько записей 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. Спасибо.
Просто предупредите, что ваш пример файла JSON не является допустимым JSON. Вам нужно будет заключить весь файл в квадратные скобки, а также заключить ваши ключи в двойные кавычки.






В 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. Сработало как шарм ... это именно то, что мне было нужно. Также узнал много нового. Еще раз спасибо.
Возможно, базы данных SQL - не лучший выбор. SQL требует фиксированной схемы.