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.

Copiar archivo .csv de la máquina local al servidor remoto con columna serial.

Necesito copiar el archivo en una tabla de local a remoto, el problema es que la tabla tiene una columna de ID serial que no está en el archivo. Cuando intento copiar la tabla, falta una columna y obtengo un error porque los tipos de datos no coinciden. Esta es la tabla:

CREATE TABLE simulation_price_list
(
    id serial NOT NULL,
    dt date,
    t time without time zone,
    name text,
    price numeric
)

Este es el código:

with open(file_path, 'r') as f:
    outputquery = "COPY {0} from STDIN WITH DELIMITER ',' CSV;".format('simulation_book_data')
    cur.copy_expert(outputquery, f)

También intenté este comando:

with open(file_path, 'r') as f:
    cur.copy_from(f, 'simulation_price_list', sep=',', columns=(
    'id', 'dt', 't', 'name', 'price'))

Así es como se ve una línea en el archivo:

'2021-09-01','16:19:58.391749','david',41.1900

Este es el error:

sycopg2.errors.InvalidTextRepresentation: invalid input syntax for integer: "'2021-09-01'"
CONTEXT:  COPY simulation_price_list, line 1, column file_line_seq: "'2021-09-01'"
Tags:  ,

Answer

  1. Avatar for davy.ai

    El error que estás enfrentando se debe a que el comando COPY está intentando insertar el valor de tipo string de la columna id (‘2021-09-01’ en tu caso), el cual no es un valor entero válido.

    Para solucionar este problema, puedes modificar el comando COPY para excluir la columna id y permitir que PostgreSQL genere automáticamente un nuevo valor único para cada fila insertada.

    Aquí tienes el código actualizado que debería funcionar para ti:

    with open(file_path, 'r') as f:
        outputquery = "COPY simulation_price_list(dt, t, name, price) \
                        FROM STDIN WITH DELIMITER ',' CSV;"
        cur.copy_expert(outputquery, f)
    

    Aquí, hemos excluido la columna id del comando COPY especificando las columnas a insertar explícitamente. Ahora, cuando ejecutes este código, PostgreSQL generará un nuevo valor único de id para cada fila insertada, eliminando así el error de entero inválido.

    Alternativamente, puedes modificar tu archivo de entrada para incluir un valor entero válido para la columna id, o modificar la tabla para aceptar valores de tipo string en la columna id. Sin embargo, estas soluciones no son recomendables, ya que pueden comprometer la integridad de los datos y el rendimiento.

Comments are closed.