insert anidado

Chema Cortes pych3m4 en gmail.com
Jue Mar 13 19:34:45 CET 2008


El 2008/3/13, damufo <damufo en gmail.com> escribió:
> Hola:
>
>  win xp
>  python 2.5
>  wx 2.8
>  adodbapi
>  bd access
>
>  Quería saber si se pueden hacer inserts anidados, sería a través de
>  adodbapi contra una base de datos access.
>  He probado así pero no va.
>
>  insert tabla (campo1, campo2) values (valor1, valor2), (valor1, valor2);

Esta sintaxis no es estándar. Hay gestores como mysql que la aceptan,
pero es mejor no usarla.

El truco consiste en usar el .executemany() de la dbapi,
parametrizando la consulta:


cur.executemany("insert tabla (campo1, campo2) values (?,?)", lista_valores)


>  Y ya que estamos, el motivo es el de no hacer tantos accesos a la base
>  de datos para ganar veolcidad. La verdad es que no se si realmente
>  ganaré algo.

La dbapi supone que un buen gestor de bases de datos, antes de
ejecutar el .executemany(), puedee "preparar" la consulta
parametrizada y así acelerar su ejecución.  La realidad es los
conectores no llegan a "preparan" la consulta, acabando por ejecutar
la consulta tantas veces como parámetros haya.

Otra cosa es que access no es ninguna maravilla, así que no esperes maravillas.


>  De cada vez que inserto registros lo hago por cientos, de esta forma
>  intentaré que en lugar de 10 accesos sea uno pero con todo de una vez
>  (si se puede claro).

El ADO gestiona su propia caché, por lo que no te debería preocupar
cuántos accesos se hagan. En general, los gestores de bases de datos
(buenos) tienen estrategias para evitar que haya ralentización, por
muy frecuentes que se hagan los commits o se hagan transacciones
masivas. Claro está, me estoy refiriendo a los gestores buenos.

Si quieres algún consejo, decirte que access tiene el problema de que
bloquea parte de la tabla que estás modificando (bloque de tamaño
indeterminado, que sobrepasa del tamaño del registro), lo que provoca
errores extraños. Es mejor que no pienses en optimizar y haz que el
programa acabe cuanto antes, por ejemplo, activando el autocommit para
que haga la transacción en cada insert. Así mismo, te puedes plantear
el abrir la base de datos en exclusiva (parámetro Exclusive=1 en la
cadena de conexión).
_______________________________________________
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