1 Desde la línea de comandos

Con cierta frecuencia podemos necesitar acceder a la base de datos desde fuera de nuestra aplicación, ya sea para crear tablas, depurar la aplicación, realizar operaciones de mantenimiento sobre la base de datos, etc.

Para esas tareas podemos usar el programa desde la línea de comandos. Basta con invocarlo usando el comando "sqlite3.exe".

C:\programas\ejsqlite>sqlite3
SQLite version 3.7.3
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

Podemos escribir ".help" para consultar los comandos del programa, o introducir sentencias SQL para su ejecución.

Los comandos empiezan con un punto, y no terminan con el punto y coma final. Se pueden ver todos los comandos en el apéndice B, pero los más útiles son los siguientes:

  • .help : Muestra la lista de comandos y sus parámetros, con una pequeña indicación de lo que hacen.
  • .quit o .exit : Salir del programa en línea de comandos.
  • .databases : Muestra una lista de las bases de datos abiertas actualmente. Dependiendo de las circunstancias se mostrará una base de datos princpal (main), y a veces una temporal, (temp), además de las que hayamos abierto. Si hemos iniciado el programa con un parámetro que indique una base de datos, esa base de datos pasará a ser la principal (main).
  • .mode : Permite cambiar entre varios formatos de listados de salida, como csv, html, insert, line o list, entre otros.
  • .tables : Muestra una lista de tablas en la base de datos principal (main).
  • .schema : Muestra la sentencia CREATE TABLE usada para crear las tablas de la base de datos principal. Se puede indicar un parámetro sí sólo queremos ver el esquema de ciertas tablas.
  • .indices : Muestra una lista de índices en la base de datos principal.

Veamos un ejemplo. Crearemos una base de datos a la que añadiremos dos tablas, y algunos datos. Luego usaremos esta base de datos en un programa C/C++.

Empezaremos creando la base de datos, para ello arrancamos el programa indicando un nombre de fichero que contendrá la base de datos. Por convenio, la extensión del fichero será ".db", pero puede tener cualquier extensión:

C:\programas\ejsqlite>sqlite3 agenda.db
SQLite version 3.7.3
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .databases
seq  name             file
---  ---------------  ----------------------------------------------------------
0    main             C:\programas\ejsqlite\agenda.db
sqlite>

Ahora crearemos dos tablas, una de usuarios, que contendrá los nombres y direcciones de correo de nuestra agenda, y otra de teléfonos, que contendrá los números de teléfono de los usuarios.

sqlite> CREATE TABLE usuario (
   ...> claveusuario INT,
   ...> nombre VARCHAR(80),
   ...> email VARCHAR(60)
   ...> );
sqlite> .tables
usuario
sqlite> .schema
CREATE TABLE usuario (
claveusuario INT,
nombre VARCHAR(80),
email VARCHAR(60)
);
sqlite> CREATE TABLE telefono (
   ...> claveusuario INT,
   ...> numero VARCHAR(15)
   ...> );
sqlite> .tables
telefono  usuario
sqlite> .schema
CREATE TABLE telefono (
claveusuario INT,
numero VARCHAR(15)
);
CREATE TABLE usuario (
claveusuario INT,
nombre VARCHAR(80),
email VARCHAR(60)
);
sqlite>

Por supuesto, se trata de un ejemplo simplificado, y tiene algunas carencias de diseño, pero nos servirá para este ejemplo.

Añadamos algunos valores:

sqlite> INSERT INTO usuario VALUES(
   ...> 1, "Fulano", "fulano@dominio.com");
sqlite> INSERT INTO usuario VALUES(
   ...> 2, "Mengano", "mengano@dominio.com");
sqlite> SELECT * FROM usuario;
1|Fulano|fulano@dominio.com
2|Mengano|mengano@dominio.com
sqlite> INSERT INTO telefono VALUES(
   ...> 1, "(854) 444 44 44");
sqlite> INSERT INTO telefono VALUES(
   ...> 1, "(854) 444 44 55");
sqlite> INSERT INTO telefono VALUES(
   ...> 2, "(857) 555 55 54");
sqlite>

Finalmente, una consulta multitabla sencilla:

sqlite> SELECT * FROM usuario,telefono USING(claveusuario);
1|Fulano|fulano@dominio.com|(854) 444 44 44
1|Fulano|fulano@dominio.com|(854) 444 44 55
2|Mengano|mengano@dominio.com|(857) 555 55 54
sqlite>

Por supuesto, SQLite dispone de la mayor parte de las sentencias SQL estándar, algunas de ellas con ciertas limitaciones, pero la mayoría prefectamente funcionales. Podemos crear índices, hacer consultas, insertar, modificar o eliminar filas, borrar tablas, modificarlas, etc.