duda: sqlite 2 vs sqlite 3

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Hola
He estado mirando las ayudas de las 2 versiones para actualizar un proyecto hecho con sqlite 2.x a 3, pero tengo la duda siguiente porque no lo termino de ver claro, en sqlite 2 existia la funcion "sqlite.querytotable" y en sqlite 3 no existe esto. ¿Esta funcion podria ser el equivalente a esta funcion de sqlite 3 "stmt:prepare" (que es algo asi como preparar sentencias sqlite para su uso en multiples veces a lo largo del codigo? Si no es asi con que comando se corresponderia?

En amsfiles hay dos ejemplos identicos de agenda en sqlite , uno es en dos y el otro en 3

okey gracias por la indicacion si tengo alguna duda mas sobre las equivalencias en las antiguas funciones ya lo diré, gracias de nuevo.

Rafaxplayer o cualquier otro experto en sqlite, he leido un apartado de sqlite sobre las sentencias sqlite preparadas esa que lleva las siglas stmt. ¿En que situaciones se puede usar en la practica los stmt?

Haber, sqlite3 esta mucho mejor ordenado que sqlite2 otra cosa es que sea un poco mas complejo, pero en realidad todos los sistemas sql funcionan igual.

La realidad de la funcion querytotable es que es altamente ineficiente sobre todo si hablamos de consultas grandes, donde hay que obtener todos los datos de la consulta y estrujarlos en la tabla.

en una situacion normal trabajando con SQL lo logico es ir iterando entre los diferentes "rows" que poduce una consulta, lo equivalente en sqlite3 seria la funcion fetch con la que puedes ir obteniendo rows 1 a 1 hasta acabar.

lo que comentas de stmt=statement=consulta todas esas movidas de prepare y tal es para realizar consultas muy grandes, estas cosas se utilizan en entornos en los que hay que controlar los tiempos de carga de cantidades masivas de datos. Aqui te dejo un enlace a un estudio muy bueno acerca de este tipo de situaciones http://blog.quibb.org/2010/08/fast-bulk ... to-sqlite/

Imagen

Como puedes ver insertar de forma normal con exec 100 elementos tomaria unos 5 segundos, en los que la app esta colgada, usando consultas preparadas en cambio, se pueden insertar 500.000 en el mismo tiempo de carga.

Una parte muy importante de trabajar con bases de datos es la maxima optimizacion a la hora de leer y escribir, cuanto mas ahorro mejor, y el uso de indices y otras tecnicas para mejorar la fluidez

Hola Pabloko:

Gracias por esta informacion tan util (me pregunto como habra hecho las mediciones con los distintos tipos de comandos del sqlite3, es un currazo), siguientes dudas que me planteo:

1- Si con lo que dices del stmt, si tuviera que manejar bd grandes de 2000 items ¿tu me aconsejarias usar este comando stmt a modo de precarga de datos? quiero decir si quiero pre-leer los datos ¿se puede usar este comando y luego ejecutar los comandos usuales de sqlite?
2- Si uso el comando stmt no haria necesario el uso de for nrow in nombredetabla do porque se presupone que ya esta leyendo uno a uno los items ¿es correcto esto o no lo he entendido bien?

aeeeeeeeeeeeeeeiHOOOOOOOOOOO no e entendio una puta mierda xd

Una cosa es tener muchos registros en una bbdd y otra es tener que leer/escribir muchos en un corto espacio de tiempo, son cosas muy distintas.

Sigo sin saber a que coño te refieres con stmt porque como te he dicho stmt=statement=consulta=query que es la forma basica de lenguage sql y que se utiliza para absolutamente todo...

Ni siquiera explicas si lo que quieres es leer o escribir, o si tienes que hacerlo con absolutamente todos los regustros a la vez, en cada caso hay una forma distinta de proceder.

Generalmente preparar una consulta se hace solamente con los insert, si se quieren insertar mas de 10 registros es buena idea preparar la consulta y es por lo siguiente, imagina esta consulta:

INSERT INTO tabla (id,nombre,apellido) VALUES (NULL,'AAAA','BBBB');

Cada vez que la ejecutas, el motor sql debe de reconocer el comando insert, buscar la tabla, abrirla, localizar los campos y crear el registro, en una consulta preparada, este proceso solo se hace una vez y se van creando registros consecutivamente sin tener que realizar las otras tareas que no son necesarias por lo que se ahorra en velocidad de procesamiento.

Y como nota, realizar mediciones de tiempo de carga en un script no es tan raro, de hecho deberia ser la practica mas normal a la hora de trabajar con un app que tenga bases de datos, realizar una serie de pruebas unitarias y de stress sobre la base de datos creando cantidades de datos ridiculamente altas en comparacion con las expectativas de uso. Para medir tiempos de ejecucion se puede usar la funcion de lua:
tiempo1 = os.clock()
--realizar lecturas sql aqui
tiempo2 = os.clock()
printf("Operacion realizada en "..(tiempo2-tiempo1).." ms")
Y por cierto, desde cuando es grande una bbdd con 2000 rows? Tengo aplicaciones que almacenan millones de registros al dia, ininterrumpidamente y no es que se necesite mucha optimizacion...

jajaja Tenia un cacao mental con esto de las stmt. Con lo que me has explicado era exactamente lo que queria saber. Gracias campeon por la aclaracion.

Bendito Lua jajaja esa funcion me es muy util
Yo juego jajajajaja. Creo recordar algo de ésto.

A lo que se refiere con "stmt" es que en varios códigos se ve algo como "stmt = db:prepare(...query...)" y luego se ejecuta con "stmt:execute" o algo así, y con sqlite2 existía una función querytotable.

El "stmt = db:prepare(...query...)" es crear un prepared statement, lo cual es mucho mas eficiente que solo ejecutar el mismo query, o en este caso lo que antes era el querytotable.