2017-01-31 1 views
0

J'ai le code python suivant qui copie le contenu d'une table sur postgres DB1 et INSERTS dans une table similaire sur DB2 postgres.Python Postgres Meilleure façon d'insérer des données d'une table sur un DB vers une autre table sur un autre DB

Je veux l'accélérer en utilisant des INSERTS EN VRAC. Comment puis-je obtenir ce

import psycopg2 
import sys 
import os 


all_data = [] 


try: 
    connec = psycopg2.connect("host = server1 dbname = DB1 ") 
    connecc = psycopg2.connect("host = server2 dbname = DB2 ") 
    connec.autocommit = True 
    connecc.autocommit = True 
except: 
    print("I am unable to connect to the database.") 


cur = connec.cursor() 

curr = connecc.cursor() 



cur.execute("""SELECT * FROM TABLE1""") 


curr.execute("TRUNCATE table TABLE2") 

rows = cur.fetchall() 

for row in rows: 
    all_data = row 


    curr.execute("INSERT INTO TABLE2 " 
       "VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,  %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s," 
      " %s)" 
    ,(all_data[0], all_data[1],all_data[2],all_data[3],all_data[4],  all_data[5], all_data[6], all_data[7], 
     all_data[8], all_data[9], all_data[10], all_data[11],  all_data[12], all_data[13], all_data[14],all_data[15], 
     all_data[16], all_data[17], all_data[18], all_data[19], 
     all_data[20], all_data[21], all_data[22])) 

    connecc.commit() 

connec.close() 

connecc.close() 
+0

Check [Copier vers et Copier à partir] (http://initd.org/psycopg/docs/usage.html# using-copy-to-and-copy-from) –

Répondre

1

façon simple est d'utiliser FDW (Les enveloppes de données étrangères) pour connecter les deux serveurs (https://www.postgresql.org/docs/9.5/static/postgres-fdw.html). Et opérer par les deux tables dans un serveur.

La deuxième façon est d'utiliser dblink (https://www.postgresql.org/docs/9.6/static/dblink.html).

à la fois par ces données de façon passent directement d'un serveur à la seconde (pas via votre programme)

+0

DBLINK à la rescousse –

+0

FDW est la nouvelle façon, mais avait besoin de plus d'actions. Mais permettre de faire des requêtes à des tables étrangères comme locales. Plus que des tables étrangères peuvent être non seulement postgresql - mais aussi oracle, mysql et même juste fichier csv :-) –