Python - Importar tablas dbf (foxpro2.6) a mysql

 
Vista:
Imágen de perfil de Alberto

Importar tablas dbf (foxpro2.6) a mysql

Publicado por Alberto (20 intervenciones) el 20/03/2015 20:47:47
Hola,

Tengo que importar tablas dbf de un sistema realizado en foxpro26 a mysql, como lo podria hacer utilizando python 3.4?

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Importar tablas dbf (foxpro2.6) a mysql

Publicado por anon (9 intervenciones) el 31/03/2015 10:15:23
Hola.
Para leer un dbf instalar y probar:

http://dbfread.readthedocs.org/en/latest/

1
$ sudo pip install dbfread

1
2
3
from dbfread import DBF
for record in DBF('people.dbf'):
    print(record)


Esto seria el primer paso, si te funciona comenta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Alberto

Importar tablas dbf (foxpro2.6) a mysql

Publicado por Alberto (20 intervenciones) el 01/04/2015 14:56:03
Hola,

Pude leer el dbf sin problema, la salida que me da es:

OrderedDict([('DESTINO', 464), ('NOMBRE', 'LINARES'), ('CLASE', 1), ('CIUDAD', '
')])
OrderedDict([('DESTINO', 465), ('NOMBRE', 'PARRAL'), ('CLASE', 1), ('CIUDAD', ''
)])
OrderedDict([('DESTINO', 466), ('NOMBRE', 'CHASICO(BS.AS.)'), ('CLASE', 1), ('CI
UDAD', 'S')])

Me podes dar una idea de como grabar los datos en una tabla de mysql.

Gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Importar tablas dbf (foxpro2.6) a mysql

Publicado por anon (9 intervenciones) el 01/04/2015 17:09:00
El sgte. paso es poder crear la estructura de la tabla en mysql.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from dbfread import DBF
 
def sql_create_table(db):
    """ Para crear la tabla con sql.
    (Ajustar hasta que funcione correctamente) """
    columnas = []
    campos = db.fields
    for campo in campos:
        tipo = campo.type
        if tipo == "C": # Caracter.
            tmp = "%s VARCHAR(%s)" % (campo.name, campo.length + 1)
            columnas.append(tmp)
        elif tipo == "N": # Numerico.
            tmp = "%s NUMERIC(%s, %s)" % (campo.name, campo.length, campo.decimal_count)
            columnas.append(tmp)
        elif tipo == "D": # Fecha.
            tmp = "%s DATE" % (campo.name,)
            columnas.append(tmp)
        else:
            raise NotImplementedError("Tipo %s no implementado" % tipo)
 
    q = "CREATE TABLE IF NOT EXISTS %(nombre)s\n(\n%(columnas)s\n);"
    q = q % dict(nombre=db.name.rstrip(".dbf"),
                 columnas=",\n".join(columnas))
    return q
 
 
 
# Conexion con el dbf.
db = DBF("tabla.dbf")
 
# Estructura de la tabla.
sql = sql_create_table(db)
 
# Establecer una conexion a mysql y ejecutar este script.
print(sql)
 
 
 
# # Datos.
# for record in db:
#     print(record)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Alberto

Importar tablas dbf (foxpro2.6) a mysql

Publicado por Alberto (20 intervenciones) el 01/04/2015 21:44:36
Perfecto!
Me dio el siguiente resultado:

C:\Python34\python.exe R:/prjpy/import_dbf/import_fox.py
CREATE TABLE IF NOT EXISTS destino
(
DESTINO NUMERIC(5, 0),
NOMBRE VARCHAR(36),
CLASE NUMERIC(1, 0),
CIUDAD VARCHAR(2)
);

Process finished with exit code 0

Voy a probar la conexion a la base de datos.
Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alberto

Importar tablas dbf (foxpro2.6) a mysql

Publicado por Alberto (20 intervenciones) el 08/04/2015 20:31:38
Hola,

Se genero con exito la tabla en la base, me podrias orientar como recorrer el dbf e insertar los datos en la base?

Gracias!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
try:
    import pymysql
except ImportError:
    pass
 
from dbfread import DBF
 
DB_HOST = 'localhost'
DB_USER = 'root'
DB_PASS = 'xxxxxx'
DB_NAME = 'repositorio'
 
def run_query(query=''):
    datos = [DB_HOST, DB_USER, DB_PASS, DB_NAME]
 
    conn = pymysql.connect(*datos)
    cursor = conn.cursor()
    cursor.execute(query)
 
    if query.upper().startswith('SELECT'):
        data = cursor.fetchall()
    else:
        conn.commit()
        data = None
 
    cursor.close()
    conn.close()
 
    return data
 
 
def sql_create_table(db):
    columnas = []
    campos = db.fields
    columnas.append("id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY")
 
    for campo in campos:
        tipo = campo.type
        if tipo == "C":
            tmp = "%s VARCHAR(%s)" % (campo.name, campo.length + 1)
            columnas.append(tmp)
        elif tipo == "N":
            tmp = "%s NUMERIC(%s, %s)" % (campo.name, campo.length, campo.decimal_count)
            columnas.append(tmp)
        elif tipo == "D":
            tmp = "%s DATE" % (campo.name)
            columnas.append(tmp)
        else:
            raise NotImplementedError('Tipo %s no implementado' % tipo)
 
    q = "CREATE TABLE IF NOT EXISTS %(nombre)s\n(\n%(columnas)s\n);"
    q = q % dict(nombre=db.name.rstrip(".dbf"), columnas=",\n".join(columnas))
 
    return q
 
#Conexion con el dbf.
db = DBF('r:/prj/fox/sueldos/destino.dbf')
 
#Estructura de la tabla
sql = sql_create_table(db)
 
#Establecer una conexion a mysql y ejecutar el script
#print(sql)
run_query(sql)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Importar tablas dbf (foxpro2.6) a mysql

Publicado por anon (9 intervenciones) el 09/04/2015 12:08:29
Excelente.

Para insertar los datos con INSERT INTO.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def sql_insert_into(dbf):
    """ OBS: El id se autoincrementa solo. """
 
    comilla = "`"
    campos = db.fields
    nombre = comilla + db.name.rstrip(".dbf") + comilla
    columnas = []
    params = []
    for campo in campos:
        columnas.append(comilla + campo.name + comilla)
        params.append("%s")
    q = "INSERT INTO %s (%s) VALUES(%s);" % (nombre, ",\n".join(columnas), ",\n".join(params))
    return q
 
 
# Conexion con el dbf.
db = DBF('r:/prj/fox/sueldos/destino.dbf')
 
# Conexion con mysql.
datos = [DB_HOST, DB_USER, DB_PASS, DB_NAME]
conn = pymysql.connect(*datos)
cursor = conn.cursor() # Creamos un cursor para insertar los datos.
 
sql = sql_insert_into(db) # Estructura del INSERT INTO.
 
# Datos.
for record in db:
    cursor.execute(sql, tuple(record.values()))
 
 
conn.commit()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Alberto

Importar tablas dbf (foxpro2.6) a mysql

Publicado por Alberto (20 intervenciones) el 09/04/2015 18:10:41
Exito Total!!!...

Voy a tratar de armar una función que arme un array con los dbfs que hay en la carpeta y que llame al programa para que realice la creación de la tabla e inserte los registros en la base de datos.

Muchas gracias por tu ayuda!!
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar