Я работаю над проектом в python, где я получаю json из REST API, используя запросы, а затем продолжаю загружать его в базу данных PostgreSQL. json, на который отвечает API, структурировано, как показано ниже. Моя основная проблема касается вложенных полей, таких как location.lat
и полей, вложенных в массив info
, например info[0].value
.
{
"items": [
{
"id": 300436,
"item_id_parent": null,
"reference": "",
"subreference1": "CAMS\/1",
"subreference2": "CAMS\/1",
"reference_alpha": null,
"reference_numeric": null,
"oid": "CAMS\/1",
"code": null,
"code_custom": null,
"name": "284",
"image": "https:\/\/static.inventsys.com.br\/278\/thumb\/f-3298886-200x200c.jpg",
"situations": [],
"project_id": 10762,
"project": {
"id": 10762,
"name": "Fauna EGR",
"color": null
},
"category_id": 20685,
"category": {
"id": 20685,
"name": "EGR FAUNA - Armadilhas"
},
"area_id": null,
"area": null,
"location": {
"lat": -30.136699676514,
"lng": -50.910511016846,
"address": {
"region": "RS",
"city": "Viamão",
"district": null,
"zipcode": null,
"street": "Rodovia Tapir Rocha",
"street_number": null,
"desc": null,
"full": "Rodovia Tapir Rocha Viamão \/ BR"
}
},
"event_last": null,
"description": null,
"search_terms": "CAMS\/1 284 Fauna EGR EGR FAUNA - Armadilhas Rodovia Tapir Rocha Viamão \/ BR",
"info": [
{
"id": 42725,
"name": "Observacoes",
"type": "longtext",
"value": null,
"fvalue": null,
"description": null,
"ikey": null,
"group": "Fauna EGR",
"preload": false,
"filling": false,
"primary": false,
"created": null
},
{
"id": 44542,
"name": "Data de instalacao",
"type": "date",
"value": null,
"fvalue": null,
"description": null,
"ikey": null,
"group": "Fauna EGR",
"preload": false,
"filling": false,
"primary": false,
"created": null
},...
Пока я получаю, что мне нужно назвать поля и установить sh местозаполнитель для каждой переменной в моей таблице, и это то, что я до сих пор:
import psycopg2
conn = psycopg2.connect("host=localhost dbname=postgres user=guilhermeiablonovski") cur = conn.cursor()
dbarmadilhas = """DROP TABLE IF EXISTS egrfauna_armadilhas; CREATE UNLOGGED TABLE IF NOT EXISTS egrfauna_armadilhas( id text PRIMARY KEY, name text, image text, category_id integer, category_name text, latitude real, longitude real, imagem_orig text, observacoes text, instalacao DATE, IDcartao text, IDcamera text, IDbueiro text, estrada text, foto_armadilha text, gps_lat real, gps_long real, gps_alt real, gps_acc real);"""
cur.execute(dbarmadilhas) conn.commit()
armadilha_fields = [
'id',
'name',
'image',
'category_id',
'category.name',
'location.lat',
'location.lng',
'files[0].url_orig',
'files[1].url_low',
'info[0].value',
'info[1].value',
'info[2].value',
'info[3].value',
'info[4].value',
'info[5].value',
'info[6].value',
'info[7].value',
'info[8].value',
'info[9].value',
'info[10].value',
'info[11].value' ]
for item in registros:
my_data = [item[field] for field in armadilha_fields]
# need a placeholder (%s) for each variable
# refer to postgres docs on INSERT statement on how to specify order
cur.execute("INSERT INTO egrfauna_armadilhas VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", tuple(my_data))
conn.commit()
Проблема в том, что если Я запускаю код только с первыми четырьмя переменными, он работает нормально, поэтому я предполагаю, что мой синтаксис неверен, когда дело доходит до вложенных полей, которые я хочу проанализировать. Как лучше всего ссылаться на эти поля?
Спасибо всем заранее!