2009-12-08 4 views
17

J'ai un bloc de données, actuellement sous la forme d'une liste de n-tuples mais le format est assez flexible, que j'aimerais ajouter à une table Postgres - dans ce cas, chaque n-tuple correspond à une ligne dans le DB. Ce que je faisais jusqu'ici est d'écrire tout ceci dans un fichier CSV, puis d'utiliser COPY de postgres pour charger tout cela dans la base de données. Cela fonctionne, mais est sous-optimal, je préférerais pouvoir faire tout cela directement à partir de python. Existe-t-il une méthode à l'intérieur de python pour répliquer la charge en bloc de type COPY dans Postgres?Recréer Postgres COPIER directement en Python?

Répondre

45

Si vous utilisez le pilote psycopg2, les curseurs offrent une fonction copy_to et copy_from qui peut lire de tout objet de type fichier (y compris un tampon StringIO).

Il existe des exemples dans les fichiers examples/copy_from.py et examples/copy_to.py qui sont livrés avec le psycopg2 source distribution.

Cet extrait est tiré de l'copy_from.py exemple:

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

Mon plaisir ... si ça marche pour vous, ne pas oublier de cliquer sur le bouton accepter pour cette réponse. J'ai remarqué que vous n'avez accepté aucune des réponses à vos autres questions, mais la coche «Accepter» aide les autres personnes ayant le même problème à savoir d'un coup d'œil quelle réponse a résolu le problème pour vous. –

+0

Désolé, je n'avais même pas remarqué les coches avant :) – geoffjentry

+0

S'il vous plaît modifier ceci pour inclure les booléens et les tableaux car ceux-ci ne semblent pas fonctionner pour moi! –

Questions connexes