ORM Python

"Héctor S. Ponce" hectorsponce en gmail.com
Sab Mayo 23 00:10:48 CEST 2009


Hola, soy nuevo con python y quiero adoptar un ORM para trabajar con
bases de datos. Estoy probando con SQLAlchemy y he hecho un pequeño
ejercicio de insertar a partir de un archivo delimitado casi 300000
filas, donde cada fila de texto es:

%18514257%|%1967%|%ABACA%|%GUSTAVO ANDRES%|%EMPLEAD%|%Bº EVA PERON MZ: X
C:482%|%A%|%DNID%|%    1%|%Capital%|%1001%|%San Luis (1001)%|0|%M%|0

Quiero preguntar:

1) de los ORM que experiencia tienen en general y que valoración pueden
hacer de SQL ALchemy.
2) que mejoras se le podría hacer al programa

Gracias


Este es el programa:

##############################
import time
from sqlalchemy import *

db = create_engine('sqlite:////home/hectorsponce/sis/python/padron2.sqlite')

db.echo = False

metadata = MetaData(db)

padron = Table('padron', metadata,
    Column('matricula', String(40)),
    Column('clase', String(4)),
    Column('apellidos', String(40)),
    Column('nombres', String(40)),
    Column('profesion', String(7)),
    Column('domicilio', String(34)),
    Column('analf', String(1)),
    Column('tipodocumento', String(7)),
    Column('seccion_nro', String(5)),
    Column('seccion', String(30)),
    Column('circuito_nro', String(5)),
    Column('circuito', String(30)),
    Column('mesa', String(4)),
    Column('sexo', String(1)),
    Column('partido', String(3)))

metadata.drop_all()
padron.create()

t0=time.clock()
lista=[[field[1:len(field)-1] for field in line.split('|')] \
    for line in file('/home/hectorsponce/sis/python/padron/padron.txt')]

data=['matricula',
     'clase',
     'apellidos',
     'nombres',
     'profesion',
     'domicilio',
     'analf',
     'tipodocumento',
     'seccion_nro',
     'seccion',
     'circuito_nro',
     'circuito',
     'mesa',
     'sexo',
     'partido']

i=padron.insert()

t1 = time.clock()
print 'Tiempo de lista:' , t1-t0
print 'Filas en la lista:' , len(lista)
print '---------------------------------'
bulk=[dict(zip(*[l for l in (data, unicode(props))])) for props in lista]
t2 = time.clock()
print 'Tiempo de bulk:' , t2-t1
print 'Filas en la lista:' , len(bulk)
print '---------------------------------'
i.execute(bulk)
t3 = time.clock()
print 'Tiempo de insert:' , t3-t2
print '---------------------------------'
print 'Tiempo total:' , t3-t0

##############################

Esta es la salida de la ejecución:

Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "copyright", "credits" or "license()" for more information.

    ****************************************************************
    Personal firewall software may warn about the connection IDLE
    makes to its subprocess using this computer's internal loopback
    interface.  This connection is not visible on any external
    interface and no data is sent to or received from the Internet.
    ****************************************************************
   
IDLE 2.6.2      ==== No Subprocess ====
>>>
Tiempo de lista: 10.02
Filas en la lista: 299487
---------------------------------
Tiempo de bulk: 14.32
Filas en la lista: 299487
---------------------------------
Tiempo de insert: 32.02
---------------------------------
Tiempo total: 56.36
>>>
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es