Ver Mensaje Individual
  #5 (permalink)  
Antiguo 07/03/2016, 17:05
Avatar de dario_sanz
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