Я пытаюсь импортировать данные JSON в Postgresql с помощью Python, но получаю сообщение "psycopg2.ProgrammingError: невозможно адаптировать тип" dict ", когда я помещаю поле" via "с типом данных JSONB в созданную мной таблица в базе данных Postgresql. Есть ли способ исправить мою проблему? Любая помощь будет делать.
sample.json
[
{
"url": "https://www.abcd.com/",
"id": 123456789,
"external_id": null,
"via": {
"channel": "email",
"id": 4,
"source": {
"from": {
"address": "[email protected]",
"name": "abc def"
},
"rel": null,
"to": {
"address": "[email protected]",
"name": "def"
}
}
}
},
{
"url": "http://wxyz.com/",
"id": 987654321,
"external_id": null,
"via": {
"channel": "email",
"id": 4,
"source": {
"from": {
"address": "[email protected]",
"name": "uvw xyz"
},
"rel": null,
"to": {
"address": "[email protected]",
"name": "zxc"
}
}
}
}
]
my_code.py
import json
import psycopg2
connection = psycopg2.connect("host=localhost dbname=sample user=gerald password=1234")
cursor = connection.cursor()
data = []
with open('sample.json') as f:
for line in f:
data.append(json.loads(line))
fields = [
'url', #varchar
'id', #BigInt
'external_id', #BigInt Nullable
'via' #JSONB
]
for item in data:
my_data = [item[field] for field in fields]
insert_query = "INSERT INTO crm VALUES (%s, %s, %s, %s)"
cursor.execute(insert_query, tuple(my_data))
Одним из решений является сброс dict до вставки в db:
for item in data:
my_data = [item[field] for field in fields]
for i, v in enumerate(my_data):
if isinstance(v, dict):
my_data[i] = json.dumps(v)
insert_query = "INSERT INTO crm VALUES (%s, %s, %s, %s)"
cursor.execute(insert_query, tuple(my_data))
Проблема, с которой я столкнулся при работе с этим кодом, заключается в цикле for... он перестает работать, когда встречает нулевое значение в одном из элементов JSON, полностью останавливая код. Если я хочу продолжить выполнение кода, что мне делать?