Exemple #1
0
def generar_tablas(dsn_destino = pg_dsn):
    '''
    '''
    from psycopg2 import connect
    conexion = connect(dsn_destino)
    curs = conexion.cursor()
    nombre_tablas = TABLAS.keys()
    contador = 0
    for tabla, sql in izip(nombre_tablas, xgenerar_sql_esquema()):
        curs.execute(sql)
        conexion.commit()
        print tabla, "OK"
        contador += 1
    return contador
Exemple #2
0
def copia_datos(conexion_origen, conexion_destino, tablas, limpiar_destino = True, chunk_commit = 100):
    '''
    Copia datos entre conexiones
    '''
    conexion_destino.set_client_encoding('LATIN1')
    cur_orig = conexion_origen.cursor()
    cur_dest = conexion_destino.cursor()
    #from ipdb import set_trace; set_trace()
    cant_tablas, actual = len(tablas), 0
    for tabla, campos in TABLAS.iteritems():
        if tabla.lower() not in ('attachments', 'documentos'):
            continue
        print "Tabla", tabla
        cur_orig.execute('SELECT COUNT(*) FROM %s' % tabla)
        total_origen = cur_orig.fetchone()[0]
        
        sql_source = 'SELECT %s FROM %s' % (select_what(campos), tabla)
        
        print "Query: ", sql_source 
        cur_orig.execute(sql_source)
        
        
        if limpiar_destino:
            cur_dest.execute('DELETE FROM %s' % tabla)
            conexion_destino.commit()
            
        cant = 0
        col_utils = columnas_utiles(campos)
        cant_filas = len(col_utils)
        values_dest = ','.join(['%s' for i in xrange(cant_filas)])
        
        sql_dest = "INSERT INTO %s (%s) VALUES (%s);" % (tabla,
                                                        ','.join(columnas_insert(col_utils)),
                                                         values_dest)
            
        
        
        while True: 
            datos = cur_orig.fetchmany(chunk_commit)
            if not datos:
                break
            for fila in datos:
                try:
                    fila = adaptar_binarios(col_utils, fila)
                    cur_dest.execute( sql_dest, fila)
                except psycopg2.DataError, e:
                    if e.pgcode == '22P02':
                        print "Datos Invalidos"
                        print fila
                        conexion_destino.rollback()
                    else:
                        #from ipdb import set_trace; set_trace()
                        #print "Error en la fila", fila
                        raise
            cant += len(datos)
            if (cant % chunk_commit == 0):
                #print "Commit destino"
                conexion_destino.commit()
            print cant
        print cant
        conexion_destino.commit()
        actual += 1
        print "Exito en tabla %d de %d (%.2f%%)" % (actual, cant_tablas, 
                                                    float(actual) / cant_tablas * 100)