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