2009-12-08 21 views
17

Tengo un bloque de datos, actualmente como una lista de n-tuplas pero el formato es bastante flexible, que me gustaría adjuntar a una tabla Postgres; en este caso, cada n-tupla corresponde a una fila en el DB.¿Recreando COPIA de Postgres directamente en Python?

Lo que he estado haciendo hasta este punto es escribir todo esto en un archivo CSV y luego usar COPY de postgres para cargar todo esto en la base de datos. Esto funciona, pero no es óptimo, preferiría poder hacer esto directamente desde Python. ¿Hay algún método dentro de python para replicar la carga masiva tipo COPY en Postgres?

Respuesta

45

Si está utilizando el controlador psycopg2, los cursores proporcionan una función copy_to y copy_from que puede leer desde cualquier objeto similar a un archivo (incluido un buffer StringIO).

Hay ejemplos en los archivos examples/copy_from.py y examples/copy_to.py que vienen con el psycopg2 source distribution.

Este extracto es del ejemplo copy_from.py:

conn = psycopg2.connect(DSN) 
curs = conn.cursor() 
curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)") 

# anything can be used as a file if it has .read() and .readline() methods 
data = StringIO.StringIO() 
data.write('\n'.join(['Tom\tJenkins\t37', 
        'Madonna\t\N\t45', 
        'Federico\tDi Gregorio\t\N'])) 
data.seek(0) 

curs.copy_from(data, 'test_copy') 
+2

placer ... si funciona para usted, no se olvide de apretar el botón aceptar para esta respuesta. Me di cuenta de que no ha aceptado ninguna de las respuestas a sus otras preguntas, pero la marca de verificación "Aceptar" ayuda a otras personas que tienen el mismo problema a saber de un vistazo, cuya respuesta resolvió el problema por usted. –

+0

Lo siento, ni siquiera había notado las marcas de verificación antes :) – geoffjentry

+0

Modifique esto para incluir booleanos y matrices, ya que parece que no me funcionan. –

Cuestiones relacionadas