[Python-es] Actualizar base de datos msaccess

damufo damufo en gmail.com
Jue Mar 25 08:44:03 CET 2010


Hola Chema:

En 2010/03/25 03:19, Chema Cortes escribiu:
> On 24/03/10 22:56, damufo wrote:
>> Hola:
>> Estoy tratando de volcar una serie de registros a una base de datos de
>> access 97. son sobre 90.000
>>
>> Una vez hecha la conexión
>> Los valores los introduzco en la variable values
>>
>> for i in values:
>>          cursor.execute(sql, i)
>>          j = j + 1
>>          if j>  100:
>>              self.conexion.commit()
>>              j = 1
>
> Supongamos que 'i' sea una tupla (o al menos una secuencia) y que sql
> sea una query DML de inserción:
Si así es
>
> Para ser precisos, estás accediendo a la base de datos con el motor Jet,
> que no tiene transacciones. El commit() no hace nada, todo funcionará
> como si tuviera activado el autocommit.

Pues ahí debe estar la cuestión, el commit funciona, si pongo el commit 
y accedo a la base de datos veo en la tabla afectada como los registros 
se van insertando a medida que va haciendo el commit, si no pongo el 
commit, no veo nada hasta que hace el commit final y aparecen todo de 
repente.

>
>
>> La cosa tarda mucho, he probado a lanzar un commit cada 100 registros
>> pero nada, tarda varia horas.
>>
>> El caso es que el proceso llega a consumir 1,5 gigas de memoria ram.
>
> Te podría recomendar una alternativa usando execute_many, pero de mi
> experiencia con adodbapi te adelanto que no sirve de nada. Equivale a
> realizar "executes" individuales.
>
> Es extraño tanto consumo de memoria. No puede ser ni por adodbapi ni por
> el fragmento de código que has puesto. Trata de convertir la lista
> 'values' a un iterador o similar para que no sea necesario tener
> cargados los 90.000 registros en memoria.
>
> *Lo que seguro que te ayuda mucho es si abres la base de datos en modo
> exclusivo. Basta que añadas ";Exclusive=1" a tu cadena DSN.*
>

Mi cadena DSN es:

dsn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;"
dsn += "User Id=admin;Password=;"
dsn = dsn % (path)
self.conexion = adodbapi.connect(dsn)

donde path es la ruta de la base de datos .mdb

He cambiado la cadena de conexión añadiendo el Exclusive:

dsn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;"
dsn += "Exclusive=1;User Id=admin;Password=;"
dsn = dsn % (path)
self.conexion = adodbapi.connect(dsn)

Al añadirlo, aparece el siguiente error:
DatabaseError: (-2147352567, 'Exception occurred.', (0, u'Microsoft JET 
Database Engine', u'Could not find installable ISAM.', None, 5003170, 
-2147467259), None)

Si le quito el Exclusive=1 conecta sin problemas.




> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>



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