Prólogo
SQLite es una biblioteca que implementa en sí misma, sin servidor, y sin necesidad de configuración, un motor de base de datos SQL transicional. El código de SQLite es de dominio público y por lo tanto libre para usarlo para cualquier propósito, comercial o privado.
Introducción
El presente manual trata sobre la integración de bases de datos SQLite dentro de aplicaciones C y C++. Para ello nos limitaremos a explicar algunas de las funciones y estructuras del API de SQLite y al modo en que estas se combinan para crear programas que trabajen con bases de datos.
Se supone que el lector de este documento ya tiene conocimientos sobre diseño de bases de datos y sobre el lenguaje de consulta SQL. De todos modos, en Con Clase también se incluye un curso sobre estos temas, al que se puede acceder desde MySQL con Clase.
Instalación de bibliotecas para entornos de programación basados en GCC
Lo que sí necesitamos es, por supuesto, un compilador de C/C++. Los ejemplos que aparecen en este curso están escritos en C++, pero usaremos el API C, de modo que las estructuras de los programas deben ser fácilmente adaptables a código C.
Siguiendo lo que ya es una tradición en Con Clase usaremos el compilador Mingw y el entorno de desarrollo Dev-C++, Code::Blocks o ZinjaI para crear nuestros programas de ejemplo.
Paquetes a instalar
En la sección de descargas de SQLite existen varios paquetes, aunque no todos serán necesarios para poder trabajar con este motor de bases de datos, necesitaremos descargar algunos de ellos:
- sqlite-amalgamation-x_y_z.zip: donde las letras 'x', 'y' y 'z' indican la versión de la librería.
(Mientras escribo esto, la versión es 3.7.3). De este zip necesitaremos los siguientes ficheros:
- sqlite3.h: fichero de cabecera para incluir en nuestros programas.
- sqlite3.def: fichero de definición, contiene una lista de las funciones incluidas en la biblioteca.
- sqlite-amalgamation-x.y.z.tar.gz: se trata de los mismos contenidos, pero orientados a sistemas UNIX y LINUX.
- sqlite-x_y_z.zip: programa de línea de comandos para Windows, que nos permite acceder y modificar bases de datos.
- sqlite3-x.y.z.bin.gz: el mismo programa, para entornos Linux.
- sqlitedll-x_y_z.zip: contiene una DLL con las funciones necesarias para ejecutar SQLite, además del fichero sqlite3.def.
- sqlite-x.y.z.so.gz: contiene la librería compartida precompilada para ejecutar SQLite, necesaria en Linux.
Ni que decir tiene que sólo necesitaremos los paquetes que conciernan al sistema operativo que estemos usando.
La DLL podremos mantenerla en la misma carpeta que los ficheros ejecutables que vayamos creando, y deberemos redistribuirla junto con ellos. También se puede copiar a una carpeta a la que se tenga acceso desde el sistema (que esté incluida en el PATH), por ejemplo, "system32".
El fichero sqlite3.h deberá estar en la carpeta include del compilador. En nuestros ejemplos supondremos que está en la carpeta include/sqlite3.
El programa en línea de comandos puede estar en cualquier sitio, y lo usaremos para acceder a las bases de datos desde fuera de los programas, de modo que podemos crear tablas, modificarlas, o trabajar con los datos que contienen. Funciona como un intérprete SQL para bases de datos SQLite.
Usar ficheros incluidos con SQLite
Volveremos a explicar el método que usaremos para obtener el fichero que nos falta para poder acceder a la DLL de SQLite desde nuestro programas C/C++.
SQLite no proporciona ficheros de librería estáticas para acceder al DLL, pero podemos obtenerlos a partir del propio fichero DLL y del fichero DEF. Para hacerlo crearemos una carpeta temporal en la que copiaremos los siguientes ficheros:
- El fichero de biblioteca dinámica "dll": sqlite3.dll.
- El fichero de definición de biblioteca "def": sqlite3.def.
Y estas tres utilidades:
- Utilidad dlltool.exe.
- Utilidad as.exe.
Los dos primeros ficheros ya los tenemos, y los extraeremos de los paquetes correspondientes.
El siguiente paso es crear el fichero de biblioteca estática libsqlite.a. Para ello necesitamos las dos utilidades, dlltool.exe y as.exe que están incluidan con el compilador Mingw, y que podemos encontrar en el subdirectorio mingw32\bin del directorio donde esté instalado el compilador. Para comodidad, copiaremos estas utilidades al directorio temporal de trabajo, y ejecutaremos la siguiente sentencia desde la línea de comandos:
C:\mysqltmp>dlltool -d sqlite3.def -D sqlite3.dll -k -l libsqlite.a -S ./as.exe
La utilidad as.exe (un ensamblador) se invoca automáticamente desde dlltool. Ahora ya tenemos nuestro fichero de biblioteca estática libsqlite.a, y lo copiaremos al directorio lib del compilador.
Por último, podemos borrar el directorio de trabajo temporal. Y ya podemos usar bases de datos desde programas C/C++.
Este proceso es válido para conseguir ficheros de librería estática en formato ".a" a partir de ficheros DLL y DEF.
Usar bibliotecas desde otros compiladores
No lo he verificado, pero es de suponer que otros compiladores usarán, o bien las bibliotecas estáticas con extensión "a" si se basan en Mingw, o las que tienen extensión "lib", como los compiladores de Borland o Microsoft.
En cualquier caso, si quieres compartir tus experiencias en estos compiladores con nosotros, podremos ampliar este apartado.
Dónde usar SQLite
Extraído de la documentación de SQLite.
SQLite es diferente de la mayoría de motores de base de datos SQL, ya que su primer objetivo es ser simple:
- Fácil de administrar
- Fácil de operar
- Fácil de integrar en un programa más amplio
- Fácil de mantener y personalizar
Muchas personas usan SQLite, ya que es pequeño y rápido. Pero esas cualidades son accidentes felices. Los usuarios también encuentran que SQLite es muy fiable. La fiabilidad es una consecuencia de la simplicidad. Con menos complicaciones, hay menos cosas que puedan ir mal. Así que, sí, SQLite es pequeño, rápido y confiable, pero sobre todo, SQLite se esfuerza por ser simple.
La simplicidad en un motor de base de datos puede ser una fortaleza o una debilidad, dependiendo de lo que estamos tratando de hacer. Con el fin de lograr simplicidad, SQLite ha tenido que sacrificar otras características que algunas personas encuentran útiles, tales como alta concurrencia, control de acceso de grano fino, un rico conjunto de funciones integradas, procedimientos almacenados, funciones del lenguaje esotérico de SQL, XML y / o extensiones Java, escalabilidad de tera- o peta-bytes, y así sucesivamente. Si necesitas alguna de estas características y no te importa la complejidad añadida que conllevan, SQLite probablemente no es la base de datos que necesitas. SQLite no tiene la intención de ser un motor de base de datos empresarial. No está diseñado para competir con Oracle o PostgreSQL.
La regla básica para cuándo es apropiado utilizar SQLite es la siguiente: El uso de SQLite en situaciones donde la simplicidad de administración, implementación y mantenimiento son más importantes que las características complejas innumerables que los motores de bases de datos proporcionan. De hecho, las situaciones donde la simplicidad es la mejor opción son más comunes de lo que mucha gente piensa.
Otra forma de ver SQLite es la siguiente: SQLite no está diseñado para reemplazar a Oracle. Está diseñado para reemplazar a fopen().
Situaciones en las que SQLite funciona bien
Aplicación de formato de archivo
SQLite se ha utilizado con gran éxito como el formato de archivo en disco para aplicaciones de escritorio tales como herramientas de análisis financiero, paquetes de CAD, programas de mantenimiento, etc. La tradicional operación de "Abrir Archivo" hace un sqlite3_open() y ejecuta un BEGIN TRANSACTION para obtener acceso exclusivo al contenido. "Guardar Archivo" hace un COMMIT seguido por otro BEGIN TRANSACTION. El uso de estas operaciones garantiza que las actualizaciones del archivo son atómicas, durables, aisladas, y consistente.
Se pueden añadir triggers temporales a la base de datos para registrar todos los cambios en una tabla (temporal) que registre operaciones de deshacer/rehacer. Estos cambios se pueden reproducir de nuevo cuando el usuario presiona los botones "Deshacer" y "Rehacer". Usando esta técnica, la aplicación puede tener una profundidad ilimitada de deshacer/rehacer con un código sorprendentemente pequeño.
Los dispositivos integrados y aplicaciones
Debido a una base de datos SQLite requiere una administración pequeña o nula, SQLite es una buena opción para los dispositivos o servicios que deben trabajar solos y sin apoyo humano. SQLite es una buena opción para su uso en teléfonos móviles, PDAs, etc. También funciona bien como una base de datos integrada en aplicaciones de consumo para descargar.
Sitios Web
SQLite generalmente trabaja muy bien como motor de base de datos de sitios web de tráfico bajo o medio (es decir, el 99,9% de los sitios web). La cantidad de tráfico web que SQLite puede manejar depende, por supuesto, en gran medida de cómo utilice su base de datos el sitio web. En general, cualquier sitio que recibe menos de 100K visitas al día debería funcionar bien con SQLite. La cifra de 100K/día es un cálculo conservador, no una barrera superior. SQLite ha demostrado que puede trabajar con 10 veces esa cantidad de tráfico.
Reemplazo de archivos de disco ad hoc
Muchos programas utilizan fopen(), fread() y fwrite() para crear y gestionar archivos de datos en formatos de diseño propia. SQLite funciona especialmente bien como un reemplazo para estos archivos de datos ad hoc.
Bases de datos internas o temporales
Para los programas que tienen una gran cantidad de datos que deben ser tamizados y clasificados de diversas maneras, a menudo es más fácil y más rápido cargar los datos en una base de datos SQLite en memoria unido a las consultas con JOIN y cláusulas ORDER BY para extraer los datos en la forma y orden necesario en lugar de crear el código para las mismas operaciones de forma manual. Usar una base de datos SQL interna de esta manera también le da al programa mayor flexibilidad, ya que se pueden agregar nuevas columnas o índices sin tener que recodificar cada consulta.
Conjunto de datos de línea de comandos herramienta de análisis
Los usuarios experimentados de SQL puede emplear el programa de sqlite de línea de comandos para analizar conjuntos de datos diversos. Los datos en bruto pueden ser importados desde archivos CSV, a continuación, que los datos se puede separar para generar un gran número de informes. Los usos posibles incluyen análisis de sitios web de registro, el análisis de las estadísticas deportivas, elaboración de métricas de programación y análisis de resultados experimentales.
También puede hacer lo mismo con una base de datos de profesional cliente/servidor, por supuesto. Las ventajas de usar SQLite en esta situación es que SQLite es mucho más fácil de configurar y de la base de datos resultante es un archivo único que se puede almacenar en un disquete o una memoria flash o enviar por correo electrónico a un colega.
Suplente para una base de datos profesional durante demostraciones o pruebas
Si usted está escribiendo una aplicación cliente para un motor de base de datos profesional, tiene sentido utilizar un motor de base de datos genérico que le permite conectarse a muchos tipos diferentes de motores de base de datos SQL. Tiene sentido aún mayor dar un paso más e incluir SQLite en el conjunto de bases de datos y vincular estáticamente el motor SQLite con el cliente. De esta manera el programa cliente se puede utilizar independiente con un archivo de datos SQLite para pruebas o demostraciones.
Base de datos Pedagogía
Debido a que es simple de instalar y usar (la instalación es trivial: sólo tienes que copiar el sqlite o sqlite.exe ejecutable en el equipo y ejecutarlo) SQLite es un motor de base de datos bueno para su uso en la enseñanza de SQL. Los estudiantes pueden crear fácilmente bases de datos a su gusto y puede enviar las bases de datos al profesor junto con los comentarios o calificaciones. Para estudiantes más avanzados que estén interesados en estudiar cómo se implementa un RDBMS, el código modular y bien comentado y documentado SQLite pueden servir como una buena base. Esto no quiere decir que SQLite es un modelo exacto de cómo se construyen los motores de base de datos, sino más bien que un estudiante que entienda cómo funciona SQLite puede comprender más rápidamente los principios de funcionamiento de otros sistemas.
Extensiones experimentales del lenguaje SQL
El diseño simple y modular de SQLite hace que sea una buena plataforma para la creación de prototipos de ideas, nuevas características o experimentos del lenguaje de base de datos.