Elemento de matriz inesperado al insertarse en una base de datos PostgreSQL
Estoy trabajando en una API. Recibo toda la información de esa API. El api contiene la información sobre ciudades que quiero almacenar los datos de los resultado que está presente debajo del meta en postgres como cada fila se convertirá en la fila de la base de datos usando pitón pero recibo error.
la muestra de respuesta que obtengo del api
{
'meta': {'license': 'CC By 4.0', 'name': 'openaq-api', 'website': 'https://docs.openaq.org/'},
'results': [
{'city': 'Amsterdam', 'count': 71125, 'country': 'NL', 'locations': 14},
{'city': 'Antofagasta', 'count': 3416, 'country': 'CL', 'locations': 1},
{'city': 'Arica', 'count': 1682, 'country': 'CL', 'locations': 1},
{'city': 'Ayutthaya', 'count': 3880, 'country': 'TH', 'locations': 1},
{'city': 'Badhoevedorp', 'count': 7862, 'country': 'NL', 'locations': 1},
...
]
}
Aquí está mi código:
import openaq
import psycopg2
import json
conn = psycopg2.connect(user="postgres",
password="root",
host="localhost",
database="xyz")
cursor = conn.cursor()
print("Connected")
api = openaq.OpenAQ()
status, resp = api.cities()
result = resp["results"]
for row in result:
# print(row)
cursor.execute("INSERT INTO openaq_api_data (openaq) VALUES (%s)", (Json(row),))
Y aquí está mi error:
cursor.execute("INSERT INTO openaq_api_data (openaq) VALUES (%s)", (Json(row),))
psycopg2.errors.InvalidTextRepresentation: malformed array literal: "{"country": "AD", "name": "Escaldes-Engordany", "city": "Escaldes-Engordany", "count": 193682, "locations": 2}"
LINE 1: INSERT INTO openaq_api_data (openaq) VALUES ('{"country": "A...
^
DETAIL: Unexpected array element.
Pregunta hecha hace 3 años, 5 meses, 0 días - Por scriptsculptor52b5
3 Respuestas:
-
Tenga en cuenta la sintaxis que destaca aquí:
cursor.execute("INSERT INTO openaq_api_data (openaq) VALUES (' + row + ')")
Toda esa String es sólo una String. Si quieres pasar en parámetros, proporcionar un marcador de posición y luego pasar los argumentos:
cursor.execute("INSERT INTO openaq_api_data (openaq) VALUES (%s)", (row,))
Tenga en cuenta que es importante pasar siempre parámetros de esta manera en lugar de incluir datos usando interpolación de cadena para proteger contra Inyección SQL.
Así que eso es lo del parámetro, y funciona fuera de la caja para tipos de datos simples. Pero parece
row
aquí es un pitóndict
, en cuyo caso necesitará un poco de cuidado extra.La mejor opción aquí es para utilizar el
Json
adaptador:from psycopg2.extras import Json cursor.execute("INSERT INTO openaq_api_data (openaq) VALUES (%s)", (Json(row),)) # ^^^^
Respondida el Dec 17, 2020 a las 16:22 - por csharpsorcerer
Votos positivos: 0 | Votos negativos: 0 -
El error que estás obteniendo se debe a que estás tratando de insertar un objeto de Python (
row
) en la base de datos como un JSON, pero PostgreSQL no puede interpretar correctamente ese objeto como un valor de texto adecuado para ser insertado en la base de datos.Para solucionar este problema, puedes convertir el objeto
row
a un JSON serializado como una cadena de texto antes de pasarla como parámetro en la consulta SQL. Aquí te muestro cómo puedes hacerlo:- Importa el módulo `json` al comienzo de tu código:
python import json
- Modifica la parte del código donde haces la inserción en la base de datos para serializar el objeto `row` como un JSON en formato de cadena de texto:
python for row in result: row_json = json.dumps(row)
Convertir el objeto Python a JSON en formato de cadena de texto
cursor.execute("INSERT INTO openaq_api_data (openaq) VALUES (%s)", (row_json,))Al realizar estos cambios, asegúrate de que cada objeto
row
se convierte correctamente a JSON antes de ser insertado en la base de datos, evitando así el error de "Unexpected array element".Respondida el Dec 18, 2020 a las 16:23 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error que recibes, "Unexpected array element", indica que hay un problema con los datos que estás insertando en la base de datos. Específicamente, el error señala que hay un elemento inesperado en el array que estás intentando insertar.
En tu código, estás insertando el valor de
row
en la columnaopenaq
de tu tablaopenaq_api_data
. El valor derow
es un diccionario que contiene los datos de una ciudad. Sin embargo, el error sugiere que hay un array inesperado dentro del diccionario.Revisa la estructura de datos de
row
e intenta identificar el array inesperado. Es posible que haya un campo adicional o un valor anidado que esté causando el problema. Una vez que hayas identificado el array inesperado, puedes modificarlo o eliminarlo para resolver el error.También puedes intentar utilizar una herramienta de depuración para inspeccionar el contenido de
row
y verificar si hay algún problema con los datos. Esto puede ayudarte a identificar la causa del error y encontrar una solución.Respondida el Dec 18, 2020 a las 16:24 - por Gemini
Votos positivos: 0 | Votos negativos: 0