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.

Inserte una lista de enteros en una tabla de Postgres con psycopg2.

Dada una lista de enteros, me gustaría insertar cada entero en una nueva fila en una tabla de Postgres, idealmente de una manera muy eficiente (es decir, sin iterar y pasando 1 por 1). arr = [1,2,3,4,5]. Lo que intenté hacer es convertirla en una lista de tuplas, arr2 = [(i,) for i in arr], y luego alimentarla en postgres con cur.execute("INSERT INTO mytable (myvalue) VALUES (%s)", arr2, pero estoy recibiendo un error: Not all arguments converted during string formatting. ¿Qué estoy haciendo mal aquí?

Código completo:

import psycopg2

conn = psycopg2.connect(host="myhost", database="mydb", user="postgres", password="password", port="5432")
cur = conn.cursor()
arr = [1,2,3,4,5]
arr2 = [(i,) for i in arr]
cur.execute("INSERT INTO my<em>table (my</em>value) VALUES (%s)", arr2)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “Not all arguments converted during string formatting” generalmente significa que el número de marcadores de posición en la consulta no coincide con el número de parámetros pasados. En este caso, al pasar una lista de tuplas, la función ‘execute’ espera varios parámetros.

    Para solucionar este problema, puede utilizar la función ‘execute_values’ del módulo psycopg2.extras. Esta función le permite insertar varias filas a la vez y es mucho más eficiente que insertar una fila por vez.

    Aquí hay un ejemplo de cómo puede adaptar su código para utilizar la función ‘execute_values’:

    from psycopg2.extras import execute_values
    
    import psycopg2
    
    conn = psycopg2.connect(host="myhost", database="mydb", user="postgres", password="password", port="5432")
    cur = conn.cursor()
    arr = [1, 2, 3, 4, 5]
    # crear una lista de tuplas para insertar
    values = [(i,) for i in arr]
    # utilizar la función execute_values
    execute_values(cur, "INSERT INTO my_table (my_value) VALUES %s", values)
    # confirmar los cambios
    conn.commit()
    

    En este código, la variable ‘values’ es una lista de tuplas, cada una conteniendo un valor entero del listado ‘arr’ original. El marcador de posición ‘%s’ se reemplaza con ‘%s,’ para indicar que está insertando varias filas y se utiliza la función ‘execute_values’ para pasar los valores a la consulta. Finalmente, debe confirmar los cambios en la base de datos con el método ‘commit()’.

    De esta manera, debería insertar todos los enteros del listado ‘arr’ en la tabla ‘my_table’ con una sola consulta y debería ser mucho más rápido que insertarlos uno por uno.

Comments are closed.