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?
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étodoexecute()
. 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)
adata = [str(d) for d in data]
para convertir cada elemento de la lista a una cadena antes de pasarlo al métodoexecute()
.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()
ojson_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.