2011-01-18 29 views
6

Tengo un archivo .sql que contiene miles de instrucciones de inserción individuales. Lleva una eternidad hacerlos todos. Estoy tratando de encontrar una manera de hacer esto de manera más eficiente. En python, la biblioteca sqlite3 no puede hacer cosas como ".read" o ".import", pero executescript es demasiado lento para muchas inserciones.Python y sqlite3 - agregando miles de filas

Instalé el shell sqlite3.exe con la esperanza de usar ".read" o ".import" pero no puedo entender cómo usarlo. Ejecutarlo a través de django en eclipse no funciona porque espera que la base de datos esté en la raíz de mi unidad C, lo que parece una tontería. Ejecutarlo a través de la línea de comandos no funciona porque no puede encontrar el archivo de mi base de datos (a menos que esté haciendo algo mal)

¿Algún consejo?

Gracias!

+0

¿Qué estás tratando de hacer? Ejecutar miles de instrucciones de inserción en una base de datos sqlite3? – kefeizhou

Respuesta

11

¿Está utilizando transacciones? SQLite creará una transacción para cada insert statement individually by default, lo que ralentiza la velocidad.

Por defecto, el módulo del sqlite3 abre transacciones implícitamente antes a Los datos Modificación Language (DML) (es decir INSERT/UPDATE/borrar/reemplazar)

Si crea manualmente una sola transacción al principio y al final lo comprometerá, acelerará mucho las cosas.

+2

Es por eso que amo este sitio. Tenía exactamente el mismo tipo de problema que el OP, intentando insertar más de 42000 filas en un DB. Tomó minutos. En función de las respuestas aquí, agregué las instrucciones BEGIN..COMMIT alrededor de los INSERT y tardé menos de 5 segundos en insertar todas las filas. ¡Gracias! – sizzzzlerz

+0

¿Estás diciendo simplemente poner una declaración BEGIN y COMMIT para envolver todos los insertos? Si sqlite3 hace transacciones automáticamente, eso no solo agravará el problema O detendrá el comportamiento de sqlite3 – JPC

+1

@JPC Sí, ponga un solo COMIENZO antes de la primera inserción y COMPRUEBE después de la última. Sqlite solo creará automáticamente una transacción si aún no está en una, por lo que la creación manual de una evita que el problema suceda. – mikel

3

¿Intentó ejecutar las inserciones dentro de una sola transacción? Si no, cada inserción se trata como una transacción y ... bueno, puede leer las preguntas más frecuentes de SQLite para este here

1

utilizar una consulta parametrizada

y

Uso de una transacción.

2

También pruebe VACUUM y ANALYZE ing en el archivo de la base de datos. Me ayudó con un problema similar al mío.

Cuestiones relacionadas