07/03/2016, 17:05
|
| | | 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 |