Postgres de Columno Indefinido Python

Tengo un marco de datos a continuación. Los nombres de las columnas son iguales tanto en el marco de datos como en la base de datos. al insertar estos datos en la base de datos me dio un error

    ---------------------------------------------------------------------------
UndefinedColumn                           Traceback (most recent call last)
 in 
      4 for i,row in df.iterrows():
      5     sql = "INSERT INTO open_aq_location (" +cols + ") VALUES (" + "%s,"*(len(row)-1) + "%s)"
----> 6     cursor.execute(sql, row)
      7 
      8 #     # the connection is not autocommitted by default, so we must commit to save our changes

UndefinedColumn: column "sourcename" of relation "open_aq_location" does not exist
LINE 1: ...cation (id,country,city,cities,location,locations,sourceName...
                                                             ^

|id    |country |   city             |      cities         |location |locations |sourceName   | sourceNames   | sourceType  |   sourceTypes   |               coordinates                     |    firstUpdated           | lastUpdated                |        parameters              |       countsByMeasurement               | count  |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|AD-1  |  AD    | Escaldes-Engordany |[Escaldes-Engordany] |AD0942A  |[AD0942A] |EEA Andorra  | [EEA Andorra] | government  |   [government]  | {'longitude': 1.53914, 'latitude': 42.50969}  | 2017-09-13T21:00:00.000Z  | 2020-12-18T12:00:00.000Z   |    [co, no2, o3, pm10, so2]    |   [{'parameter': 'co', 'count': 32426}, | 161833 |
|AD-2  |  AD    | Escaldes-Engordany |[Escaldes-Engordany] |AD0944A  |[AD0944A] |EEA Andorra  | [EEA Andorra] | government  |   [government]  | {'longitude': 1.56525, 'latitude': 42.51694}  | 2017-09-13T21:00:00.000Z  | 2020-12-18T12:00:00.000Z   |    [o3]                        |   [{'parameter': 'o3', 'count': 32455}] | 32455  |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Código:

cols = ",".join([str(i) for i in df.columns.tolist()])
print(cols)
# Insert DataFrame recrds one by one.
for i,row in df.iterrows():
    sql = "INSERT INTO col_name (" +cols + ") VALUES (" + "%s,"*(len(row)-1) + "%s)"
    cursor.execute(sql, row)

#     # the connection is not autocommitted by default, so we must commit to save our changes
    conn.commit()

Pregunta hecha hace 3 años, 4 meses, 29 días - Por techwizkid


2 Respuestas:

  • El error que estás experimentando se debe a que el nombre de la columna "sourceName" en tu DataFrame no coincide exactamente con el nombre de la columna en tu base de datos. Es importante asegurarse de que los nombres de las columnas en el DataFrame coincidan exactamente con los nombres de las columnas en la tabla de la base de datos para evitar este tipo de errores.

    Para corregir esto, primero revisa los nombres de las columnas en tu DataFrame y asegúrate de que coincidan exactamente con los nombres de las columnas en tu tabla de la base de datos.

    Después, puedes modificar tu código de la siguiente manera para asegurarte de que estás insertando los valores en las columnas correctas:

    python
    cols = ",".join([str(i) for i in df.columns.tolist()])
    print(cols)
    

    Insert DataFrame records one by one.

    for i, row in df.iterrows(): sql = "INSERT INTO open_aq_location (" + cols + ") VALUES (" + "%s,"*(len(row)-1) + "%s)" cursor.execute(sql, tuple(row))

    Usar tuple(row) en lugar de solo row

    La conexión no se confirma automáticamente, así que es necesario hacerlo manualmente para guardar los cambios

    conn.commit()

    Con estos ajustes, deberías poder insertar los datos correctamente en tu base de datos PostgreSQL. Asegúrate de que los nombres de las columnas coincidan y de usar tuple(row) para pasar los valores al método execute.

    Respondida el Dec 19, 2020 a las 14:24 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error se debe a que la columna 'sourcename' no existe en la tabla 'openaqlocation' de tu base de datos PostgreSQL. Sin embargo, en el marco de datos, sí existe una columna con ese nombre.

    Para resolver este problema, puedes hacer lo siguiente:

    • Verificar el esquema de la tabla: Asegúrate de que la tabla 'open_aq_location' en tu base de datos PostgreSQL tenga una columna llamada 'sourcename'. Si no existe, puedes agregarla utilizando una consulta SQL como:
    
    ALTER TABLE open_aq_location ADD COLUMN sourcename TEXT;
    
    • Actualizar el código de inserción: Una vez que hayas verificado el esquema de la tabla, actualiza el código de inserción para incluir la columna 'sourcename'. El código actualizado debería verse así:
    python
    cols = ",".join([str(i) for i in df.columns.tolist()])
    print(cols)
    
    

    Insert DataFrame recrds one by one.

    for i, row in df.iterrows(): sql = "INSERT INTO open_aq_location (" + cols + ") VALUES (" + "%s," (len(row) - 1) + "%s)" cursor.execute(sql, tuple(row))

    Convierte la fila en una tupla

    Commit the changes.

    conn.commit()
    • Ejecutar el código actualizado:* Ejecuta el código actualizado para insertar los datos del marco de datos en la base de datos.

    Si sigues estos pasos, deberías poder insertar los datos correctamente en la tabla 'openaqlocation' de tu base de datos PostgreSQL.

    Respondida el Dec 19, 2020 a las 14:27 - por Gemini

    Votos positivos: 0 | Votos negativos: 0