Foros del Web » Programando para Internet » Python »

Se puede sincronizar con python

Estas en el tema de Se puede sincronizar con python en el foro de Python en Foros del Web. Hola colegas, no soy un experto en python, pero quiero hacerles una consulta (que debo admitir que me da un poco de vergüenza), pero es ...
  #1 (permalink)  
Antiguo 05/03/2016, 08:10
Avatar de dario_sanz  
Fecha de Ingreso: marzo-2010
Mensajes: 94
Antigüedad: 14 años, 8 meses
Puntos: 3
Se puede sincronizar con python

Hola colegas, no soy un experto en python, pero quiero hacerles una consulta (que debo admitir que me da un poco de vergüenza), pero es necesaria por que no encuentro respuestas en la web.
Se puede sincronizar con python dos bases de datos, una ubicada en un hosting en la nube y la otra en un servidor local con un rango de ip, por ejemplo c:/server/db/db.gdb.

Saludos y gracias de antemano
  #2 (permalink)  
Antiguo 05/03/2016, 15:44
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Se puede sincronizar con python

Depende de que tipo de base de datos y del tipo de "sincronización" que necesites.
No es algo que hagas con un script en python.

La mayoría de las base de datos robustas soporta replication, así una base de datos puede ir replicando en otra base de datos.

Fuentes:
https://msdn.microsoft.com/en-us/library/ms151799.aspx
https://docs.oracle.com/cd/F49540_01...1/c31repli.htm
http://dev.mysql.com/doc/refman/5.7/en/replication.html
https://wiki.postgresql.org/wiki/Rep...ection_Pooling
  #3 (permalink)  
Antiguo 06/03/2016, 20:52
Avatar de dario_sanz  
Fecha de Ingreso: marzo-2010
Mensajes: 94
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Se puede sincronizar con python

Las tablas son orientadas a objetos, con tecnología firebird (servidor local) y mysql (en la nube).
Voy a leer el articulo y luego vuelvo a comentar.
Muchas gracias por tu respuesta y muy profesional de tu parte poner las fuentes.
Saludos cordiales
  #4 (permalink)  
Antiguo 07/03/2016, 06:47
Avatar de dario_sanz  
Fecha de Ingreso: marzo-2010
Mensajes: 94
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Se puede sincronizar con python

Cita:
Iniciado por razpeitia Ver Mensaje
Depende de que tipo de base de datos y del tipo de "sincronización" que necesites.
No es algo que hagas con un script en python.

La mayoría de las base de datos robustas soporta replication, así una base de datos puede ir replicando en otra base de datos.

Fuentes:
https://msdn.microsoft.com/en-us/library/ms151799.aspx
https://docs.oracle.com/cd/F49540_01...1/c31repli.htm
http://dev.mysql.com/doc/refman/5.7/en/replication.html
https://wiki.postgresql.org/wiki/Rep...ection_Pooling

Excelente tu recomendación, creo que replication es la solución a esto. Ahora tengo que ver la forma de desarrollar un script para que actúe de forma automática los siguientes pasos : (por este motivo pensaba que python era la solución)

Automáticamente:

Base de datos Firebird =(convertirlos a)=> MYSQL (replicar como Master) = (subirlos al servidor web)=> MYSQL (replicar como esclavo).

Gracias voy a seguir en la búsqueda!

Saludos cordiales
  #5 (permalink)  
Antiguo 07/03/2016, 17:05
Avatar de dario_sanz  
Fecha de Ingreso: marzo-2010
Mensajes: 94
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Se puede sincronizar con python

Estoy utilizando un script de python para obtener datos de diferentes base de datos. Pero tengo un problema, me surge un error al obtener las tablas y los tipos de datos.
ERROR:
Código:
C:\python27>python  fdb.py
Conectado!
Recuperando nombres de tablas....!
OK!
Recuperando informaci├│n de campos de tablas!
Traceback (most recent call last):
  File "fdb.py", line 139, in <module>
    cursor.execute(cadenaSQL)
kinterbasdb.ProgrammingError: (-104, 'isc_dsql_prepare: \n  Dynamic SQL Error\n
 SQL error code = -104\n  Token unknown - line 8, column 7\n  .')
Este es el script en python fdb.py
Código:
# -*- coding: cp1252 -*-
import kinterbasdb
import os

# Fichero de creación de tablas y adición de campos.
fichero1 = 'crear_tablas.sql'
fichero2 = 'add_campos.sql'

# Ruta de conexión.
rutaAcceso = 'localhost:C:\UniServer\www\basededatos.GDB'

# Intentamos conectar con FireBird.ISO8859_1
conectado = True
conexion = True

try:
  conexion= kinterbasdb.connect(dsn=rutaAcceso,user='SYSDBA', password='*******',dialect=3, charset='ISO8859_1')
  
  print "Conectado!"
except:
  print "No he podido conectar con ", rutaAcceso

# Estamos conectados, a trabajar!
if conectado:
  # Obtenemos todas las tablas.
  cadenaSQL = '''
  select rdb$relation_name
  from rdb$relations
  where rdb$view_blr is null
  and (rdb$system_flag is null or rdb$system_flag = 0);
  '''
  # Inicializamos cursor.
  cursor = conexion.cursor()
  print "Recuperando nombres de tablas....!"
  # Ejecutamos cursor.
  cursor.execute(cadenaSQL)
  # Guardamos los nombres de las tablas en una lista.
  tablas = []
  for fila in cursor:
        tablas.append(fila[0])
  print "OK!"
  # Cadena que obtiene tablas con campos y tipos de datos.
  cadenaSQL = '''
  select rf.rdb$relation_name, rf.rdb$field_name,
  rf.rdb$field_source,
  f.rdb$field_type,t.rdb$type_name,
  f.rdb$field_sub_type, f.rdb$character_length, f.rdb$field_scale,
  f.rdb$field_length, st.rdb$type_name as
  rdb$sub_type_name,
  case f.rdb$field_type
  when 7 then 'smallint'
  when 8 then 'integer'
  when 16 then 'bigint'
  when 9 then 'quad'
  when 10 then 'float'
  when 11 then 'd_float'
  when 17 then 'boolean'
  when 27 then 'double'
  when 12 then 'datetime'
  when 13 then 'time'
  when 35 then 'timestamp'
  when 261 then 'blob'
  when 37 then 'varchar'
  when 14 then 'char'
  when 40 then 'cstring'
  when 45 then 'blob_id'
  end as "ActualType",
  case f.rdb$field_type
  when 7 then
  case f.rdb$field_sub_type
  when 1 then 'numeric'
  when 2 then 'decimal'
  end
  when 8 then
  case f.rdb$field_sub_type
  when 1 then 'numeric'
  when 2 then 'decimal'
  end
  when 16 then
  case f.rdb$field_sub_type
  when 1 then 'numeric'
  when 2 then 'decimal'
  else 'bigint'
  end
  when 14 then
  case f.rdb$field_sub_type
  when 0 then 'unspecified'
  when 1 then 'binary'
  when 3 then 'acl'
  else
  case
  when f.rdb$field_sub_type is null then 'unspecified'
  end
  end
  when 37 then
  case f.rdb$field_sub_type
  when 0 then 'unspecified'
  when 1 then 'text'
  when 3 then 'acl'
  else
  case
  when f.rdb$field_sub_type is null then 'unspecified'
  end
  end
  when 261 then
  case f.rdb$field_sub_type
  when 0 then 'unspecified'
  when 1 then 'text'
  when 2 then 'blr'
  when 3 then 'acl'
  when 4 then 'reserved'
  when 5 then 'encoded-meta-data'
  when 6 then 'irregular-finished-multi-db-tx'
  when 7 then 'transactional_description'
  when 8 then 'external_file_description'
  end
  end as "ActualSubType"
  from rdb$relation_fields rf
  join rdb$fields f
  on f.rdb$field_name = rf.rdb$field_source
  left join rdb$types t
  on t.rdb$type = f.rdb$field_type
  and t.rdb$field_name = 'RDB$FIELD_TYPE'
  left join rdb$types st
  on st.rdb$type = f.rdb$field_sub_type
  and st.rdb$field_name = 'RDB$FIELD_SUB_TYPE'
  where rf.rdb$view_context is null
  and (rf.rdb$system_flag is null or rf.rdb$system_flag = 0)
  order by
  rf.rdb$relation_name,
  rf.rdb$field_position ;
  '''
  # Inicializamos cursor.
  cursor.close()
  cursor = conexion.cursor()
  # Info.
  print "Recuperando información de campos de tablas!"
  # Ejecutamos cursor.
  cursor.execute(cadenaSQL)
  # Guardamos los nombres de las tablas en una lista.
  campos_tablas = []
  # Posiciones: 0 nombre tabla, 1 nombre campo, 2 long. campo, 10 tipo dato.
  for fila in cursor:
        campos_tablas.append((fila[0],fila[1],fila[8],fila[10]))
  # Info.
  print "OK!"
  print "Guardando información en ficheros SQL!"
  # Creamos fichero.
  f = open(os.path.realpath(fichero1), "w")
  # Creamos los create table.
  for tabla in tablas:
        cadenaSQL = 'CREATE TABLE ' + str(tabla).strip() +' ( campo_testigo char(1) ) ;'
        f.write(cadenaSQL+"\n")
  # Cerramos fichero.
  f.close()
  # Creamos fichero.
  f2 = open(os.path.realpath(fichero2), "w")
  # Creamos alter table.
  for campo in campos_tablas:
        if str(campo[3]).strip() == 'datetime' or \
        str(campo[3]).strip() == 'timestamp' or \
        str(campo[3]).strip() == 'double' or \
        str(campo[3]).strip() == 'time':
              cadenaSQL =  'ALTER TABLE ' + str(campo[0]).strip() + ' ADD ' + str(campo[1]).strip() + \
              ' ' + str(campo[3]).strip() + ' ;'
        else:
              cadenaSQL =  'ALTER TABLE ' + str(campo[0]).strip() + ' ADD ' + str(campo[1]).strip() + \
              ' ' + str(campo[3]).strip() + '(' + str(campo[2]).strip()+ ') ;'
        f2.write(cadenaSQL+"\n")
  # Cerramos fichero.
  f2.close()
  # Info.
  print "Terminada exportación de datos!"
  # Cerramos conexiones de cursor y base de datos.
  print "Cerrando conexiones!"
  cursor.close()
  conexion.close()
No puedo encontrar con exactitud el significado de ese error.
Desde ya muchas gracias!!
Saludos

Etiquetas: sincronizar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:04.