117 lines
4.4 KiB
Python
117 lines
4.4 KiB
Python
#!usr/bin/python3
|
|
|
|
import psycopg2
|
|
from psycopg2.extras import *
|
|
import time, datetime
|
|
|
|
def do_transfert(bdd, newbdd):
|
|
try:
|
|
db = psycopg2.connect("dbname='"+ bdd['base'] +"' user='" + bdd['login'] +"' host='" + bdd['host'] +"' password='" + bdd['mdp'] +"'")
|
|
newdb = psycopg2.connect("dbname='"+ newbdd['base'] +"' user='" + newbdd['login'] +"' host='" + newbdd['host'] +"' password='" + newbdd['mdp'] +"'")
|
|
cur = db.cursor()
|
|
curdata = db.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
|
newcur = newdb.cursor()
|
|
except:
|
|
raise
|
|
|
|
error = 0
|
|
for schema in bdd['schemanames']:
|
|
print("\n##### SCHEMA %s #####" % schema)
|
|
cur.execute("select tablename from pg_tables where schemaname ='%s'" % schema)
|
|
tables = cur.fetchall()
|
|
|
|
for table in tables:
|
|
|
|
start = time.clock()
|
|
print("\t##### TABLE %s #####" % table[0])
|
|
try:
|
|
cur.execute("Select c.column_name, c.data_type from information_schema.columns AS c \
|
|
WHERE c.table_schema = '%s' AND c.table_name = '%s' order by c.ordinal_position " % (schema, table[0]))
|
|
except:
|
|
error += 1
|
|
raise
|
|
|
|
columns = cur.fetchall()
|
|
vNbFields = len(columns)
|
|
req = "Select "
|
|
i = 0
|
|
for column in columns:
|
|
req += column[0]
|
|
i += 1
|
|
if i < vNbFields: req += ", "
|
|
|
|
req += " FROM " + schema + "." + table[0] + ""
|
|
|
|
try:
|
|
curdata.execute("Select * from " + schema + "." + table[0] + "")
|
|
except:
|
|
raise
|
|
|
|
donnees = curdata.fetchall()
|
|
print("\tIl y a %d enregistrements dans la table" % (len(donnees)))
|
|
print("\tTransfert des données vers la nouvelle base")
|
|
for row in donnees:
|
|
req = "INSERT INTO " + schema + "." + table[0] + "("
|
|
i = 0
|
|
for column in columns:
|
|
req += column[0]
|
|
i += 1
|
|
if i < vNbFields:
|
|
req += ", "
|
|
req +=") VALUES("
|
|
i = 0
|
|
for champs in row:
|
|
if isinstance(champs, (int, float)):
|
|
req += "%s" % champs
|
|
elif isinstance(champs, str):
|
|
req += "'%s'" % champs.replace("'", "''")
|
|
elif isinstance(champs, datetime.date):
|
|
req += "'%s'" % champs
|
|
elif champs is None:
|
|
req += "Null"
|
|
else:
|
|
req += "%s" % champs
|
|
i += 1
|
|
if i < vNbFields:
|
|
req += ", "
|
|
|
|
req +=")"
|
|
#print(req)
|
|
newcur.execute(req)
|
|
newdb.commit()
|
|
|
|
|
|
|
|
stop = time.clock()
|
|
print("\tTable copiée en %s minutes\n" % str(stop-start))
|
|
|
|
if __name__ == '__main__' :
|
|
#login = input("Entrez le login de connexion de la base postgres a generer en classes storm : ")
|
|
#mdp = input("Entrez le mot de passe de cet utilisateur postgres : ")
|
|
bdd = {}
|
|
bdd['host'] = input("Entrez l'hote de la base a generer ; ")
|
|
bdd['port'] = input("Entrez le port a utiliser : ")
|
|
bdd['base'] = input("Entrez le nom de la base de donnee a copier de ce serveur : ")
|
|
bdd['login'] = input("Entrez le nom d'utilisateur")
|
|
bdd['mdp'] = input("Entrez le mot de passe")
|
|
schema = ""
|
|
bdd['schemanames'] = []
|
|
|
|
newbdd = {}
|
|
newbdd['host'] = input("Entrez l'hôte de la nouvelle bdd : ")
|
|
newbdd['port'] = input("Entrez le port de la nouvelle bdd : ")
|
|
newbdd['login'] = input("Entrez le login de la nouvelle bdd : ")
|
|
newbdd['mdp'] = input("Entrez le mdp de la nouvelle bdd : ")
|
|
newbdd['base'] = input("Entrez le nom de la bdd a copier : ")
|
|
nb = 1
|
|
|
|
while schema != "0" :
|
|
schema = input("Entrez le nom du schema a copier n " + str(nb) + " (ou entrez le chiffre 0 pour commencer la copie des données) : ")
|
|
nb += 1
|
|
if schema != "0" :
|
|
bdd['schemanames'].append(schema)
|
|
do_transfert(bdd, newbdd)
|
|
|
|
|
|
|
|
|