Psycopg2 no genera automáticamente un ID al utilizar copy_from de un archivo CSV a una base de datos Postgres.
Tengo un archivo csv que tiene varias columnas:
upc fecha cantidad cliente
En mi tabla física, tengo una columna de ID generada automáticamente para cada fila:
id upc fecha cantidad cliente
Parece que la base de datos está interpretando el upc como el ID real cuando ejecuto mi script de python para copiar en la base de datos. Estoy obteniendo este mensaje de error:
Error: el valor “1111111” está fuera del rango para el tipo integer
CONTEXTO: COPY physical, línea 1, columna id: “1111111”
Nunca he intentado esto antes, pero creo que esto es correcto:
def insert_csv(f, table):
connection = get_postgres_connection()
cursor = connection.cursor()
try:
cursor.copy_from(f, table, sep=’,’)
connection.commit()
return True
except (psycopg2.Error) as e:
print(e)
return False
finally:
cursor.close()
connection.close()
¿Estoy haciendo algo mal aquí o tengo que crear otro script para obtener el último ID de la tabla?
Código funcional actualizado:
def insert_csv(f, table, columns):
connection = get_postgres_connection()
cursor = connection.cursor()
try:
column_names = ‘,’.join(columns)
query = f”’
COPY {table}({column_names})
FROM STDOUT (FORMAT CSV)
”’
cursor.copy_expert(query, f)
connection.commit()
return True
except (psycopg2.Error) as e:
print(e)
return False
finally:
cursor.close()
connection.close()
columns = (
“upc”,
“fecha_thru”,
“tipo_transaccion”,
“subtipo_transaccion”,
“codigo_pais”,
“cliente”,
“cantidad”,
“ingreso_bruto”,
“numero_serial”,
“fecha_uso”
)
with open(dump_file, ‘r’, newline=”, encoding=”ISO-8859-1″) as f:
inserted = insert_csv(f, ‘physical’, columns)
davy.ai
El problema es que el método
copy_from
está intentando insertar el valorupc
en la columnaid
, lo que resulta en un error porque el valorupc
es una cadena y la columnaid
es un entero.Para solucionarlo, puede modificar su script para establecer explícitamente en qué columnas desea insertar, utilizando el parámetro
columns
en el métodocopy_from
.Esto debería insertar los valores en las columnas correctas en su tabla física.