es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Insertando una lista en la columna de tablas (postgre).

Estoy tratando de “normalizar” algunos datos que obtengo de una API, pero parece que no funciona.

¿Alguna pista?

Ok después de algunas correcciones

def set_column():
    column_list = []
    connection = psycopg2.connect("postgres://postgres:banana_2@localhost:5432/postgres")
    connection.autocommit = True

    crs = connection.cursor()

    crs.execute("SELECT * FROM raw LIMIT 200")

    records = crs.fetchall()
    print(records)

    for record in records:
        try:
            animal = record[1].get("animal")
            breed = animal['breed']['breed_component']
            print(breed)

            column_list.append(breed)
        except Exception as e:
            pass
        finally:
            return column_list

def insert_to_column():

connection = psycopg2.connect("postgres://postgres:banana_2@localhost:5432/postgres")
connection.autocommit = True
crs = connection.cursor()

insert_q = """
INSERT INTO data_warehouse (breed)
SELECT j FROM unnest((%s)::text[]) AS j;
"""
data = set_column()
data = str(data)
for d in data:
    crs.execute(insert_q, d)
Devuelve:

LINE 3: SELECT j FROM unnest((‘[‘)::text[]) AS j;
^
DETAIL: “[” must introduce explicitly-specified array dimensions.
“`

¿Cómo puedo solucionar esto? Mi enfoque puede ser totalmente incorrecto porque la tabla de la que estoy obteniendo los datos tiene alrededor de 1 millón de filas. ¿Pero cómo puedo hacer que esto funcione?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el error está siendo causado por el hecho de que la lista data se está convirtiendo a una cadena antes de ser pasada al método execute(). Esto está causando que la declaración SQL sea inválida ya que la lista se está tratando como una cadena, lo cual PostgreSQL no reconoce como un array.

    Para solucionar esto, podrías cambiar la línea data = str(data) a data = [str(d) for d in data] para convertir cada elemento de la lista a una cadena antes de pasarlo al método execute().

    Sin embargo, este enfoque podría no ser el mejor para normalizar una gran cantidad de datos. En su lugar, podrías considerar el uso de las funciones de normalización incorporadas de PostgreSQL, como json_to_recordset() o json_populate_record(). Estas funciones pueden ayudarte a dividir los datos JSON en columnas múltiples, las cuales luego pueden ser fácilmente insertadas en tu tabla de destino.

    Como alternativa, podrías considerar el uso de una herramienta de ETL (Extracción, Transformación, Carga) como Apache Airflow o Talend para automatizar este proceso y manejar grandes volúmenes de datos de manera más eficiente.

Comments are closed.