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.

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)

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema es que el método copy_from está intentando insertar el valor upc en la columna id, lo que resulta en un error porque el valor upc es una cadena y la columna id 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étodo copy_from.

    def insert_csv(f, table):
        connection = get_postgres_connection()
        cursor = connection.cursor()
        try:
            cursor.copy_from(f, table, sep=',', columns=('upc', 'date', 'quantity', 'customer'))
            connection.commit()
            return True
        except (psycopg2.Error) as e:
            print(e)
            return False
        finally:
            cursor.close()
            connection.close()
    

    Esto debería insertar los valores en las columnas correctas en su tabla física.

Comments are closed.