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ón dict, 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 columna openaq de tu tabla openaq_api_data. El valor de row 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