SQLite desde Bash

Hasta la fecha siempre he utilizado SQLite o bien desde algún gestor de bases de datos como SQLite Studio, o bien desde otra herramienta como puede ser desde LibreOffice, o bien, por supuesto, desde Python. Hasta la fecha, no se me había ocurrido trabajar directamente desde el terminal. Sin embargo, recientemente escribí un artículo sobre Mycli, un interfaz para MariaDB y MySQL. Así, cuando hace unos días tuve que preparar una base de datos en SQLite, se encendió una lucecita, y pensé ¿porque no? Por que no trabajar directamente con SQLite desde Bash. Y esta es la razón precisamente para este artículo.

No solo se trata de utilizar el cliente de SQLite para el terminal, que también. Sino también, ver como puedes relacionarte con una base de datos SQLite directamente desde Bash, para así poder crear tus scripts de forma sencilla, sin que necesites recurrir a otro lenguaje de programación.

SQLIte desde Bash

SQLite desde Bash

Sobre SQLite

Seguro, o casi seguro que conoces SQLite, pero como el conocimiento no ocupa lugar, te indico unas pinceladas sobre SQLite. SQLite es una librería en C, que implementa un motor de base de datos relacional sencilla, rápida, y autocontenida.

A pesar de que se trata de un sencillo motor de bases de datos, lo cierto es que está ampliamente utilizado. Así, lo puedes encontrar en aplicaciones y lugar de lo mas variopintos. Desde aplicaciones como Adobe Photoshop Lightroom, en el cliente de Evernote, en Skype o incluso el el sistema de navegación de BMW.

Primeros pasos con SQLite desde Bash

Como ya te puedes imaginar, para empezar a trabajar con SQLite desde Bash, necesitas tener instalado SQLite. Pero esto es tan sencillo, como ejecutar la siguiente instrucción en un terminal,

sudo apt install sqlite3

sqlite3 es un sencillo cliente para el terminal con el que puedes ejecutar tus consultas sobre la base de datos de forma fácil e interactiva. Por supuesto, puedes utilizar sqlite3 para crear tus scripts. Siendo precisamente este el objetivo de este artículo.

Dentro de sqlite3

Te propongo crear una sencilla base de datos con SQLite desde Bash utilizando sqlite3 para que puedas ver lo sencillo que es. Se trata de una base de datos con dos tablas. Una primera tabla groups y una segunda tabla elements. Donde cada element pertenece a un group. Esto queda como,

CREATE TABLE IF NOT EXISTS GROUPS (ID INTEGER PRIMARY KEY, NAME TEXT);
CREATE TABLE IF NOT EXISTS ELEMENTS (ID INTEGER PRIMARY KEY, NAME TEXT, ID_GROUP INTEGER, FOREIGN KEY (ID_GROUP) REFERENCES GROUPS (ID));

Así mismo puedes insertar algunos elementos, para que la base de datos tenga algo de contenido. Para ello,

INSERT INTO GROUPS (NAME) VALUES ('GROUP1');
INSERT INTO GROUPS (NAME) VALUES ('GROUP2');
INSERT INTO GROUPS (NAME) VALUES ('GROUP3');
INSERT INTO GROUPS (NAME) VALUES ('GROUP4');
INSERT INTO ELEMENTS (NAME, ID_GROUP) VALUES ('ELEMENT11', 1);
INSERT INTO ELEMENTS (NAME, ID_GROUP) VALUES ('ELEMENT12', 1);
INSERT INTO ELEMENTS (NAME, ID_GROUP) VALUES ('ELEMENT21', 2);
INSERT INTO ELEMENTS (NAME, ID_GROUP) VALUES ('ELEMENT21', 2);

Perfecto, ahora puedes hacer algunas consultas para ver que te devuelve. Por ejemplo,

SELECT * FROM GROUPS;

Algunas herramientas con sqlite3

Lo primero y principal manejarte con sqlite3, y antes que nada saber como puedes salir de sqlite3. Esto es tan sencillo como ejecutar .exit.

Para obtener ayuda de sqlite3 dentro de sqlite3 ejecuta la instrucción .sqlite3. A partir de aquí tienes diferentes opciones como puede ser,

  • .backup para realizar copias de seguridad.
  • .shell te permite ejecutar cualquier comando en el terminal, como por ejemplo, listar el contenido del directorio en el que te encuentres .shell ls.
  • .show muestra los valores definidos para la configuración.
  • .tables muestra un listado de las tablas que se encuentran en la base de datos que estás consultando.

Tus scripts con SQLite desde Bash

Hasta hora no has hecho nada que no harías con cualquier otra base de datos. Sencillo y práctico. Pero ¿como podías hacer esto desde bash?¿Como podías trabajar con SQLite desde Bash?.

Por ejemplo, para crear la base de datos con sus tablas, e insertar los datos de ejemplo, podrías hacerlo de la siguiente forma,

sqlite3 ejemplo.db << EOF
CREATE TABLE IF NOT EXISTS GROUPS (ID INTEGER PRIMARY KEY, NAME TEXT);
CREATE TABLE IF NOT EXISTS ELEMENTS (ID INTEGER PRIMARY KEY, NAME TEXT, ID_GROUP INTEGER,     FOREIGN KEY (ID_GROUP) REFERENCES GROUPS (ID)); 
INSERT INTO GROUPS (NAME) VALUES ('GROUP1');
INSERT INTO GROUPS (NAME) VALUES ('GROUP2');
...
EOF

También puedes insertar nuevos registros de la siguiente forma,

echo "INSERT INTO GROUPS (NAME) VALUES ('GROUP5')" | sqlite3 ejemplo.db

Por supuesto también puedes hacer tus consultas, de forma sencilla. Algunos ejemplos de consultas sencillas,

echo "SELECT * FROM GROUPS" | sqlite3 ejemplo.db
echo "SELECT * FROM GROUPS WHERE ID=1" | sqlite3 ejemplo.db
echo "SELECT NAME FROM GROUPS WHERE ID=1" | sqlite3 ejemplo.db

Igualmente puedes ejecutar comandos de sqlite3 directamente desde Bash. Así para obtener un listado de las tablas que se encuentran en la base de datos, el comando a ejecutar es,

sqlite3 ejemplo.db .tables

Igualmente, también puedes hacer consultas mas complejas. Por ejemplo, una consulta, algo mas compleja de la que has visto hasta el momento,

echo "SELECT A.NAME AS ELEMENT, B.NAME AS AGROUP FROM ELEMENTS AS A INNER JOIN GROUPS AS B ON A.ID_GROUP=B.ID" | sqlite3 ejemplo.db

Un paso mas allá

No es necesario que te explique las ventajas de trabajar con una base de datos frente a otras opciones. Esto combinado con el potencial del terminal, deja en tus manos una auténtica máquina de organizar.

¿Y si quisieras introducir en serie?,

for i in GROUP6 GROUP7 GROUP8; do echo "INSERT INTO GROUPS (NAME) VALUES ('$i')" | sqlite3 ejemplo.db;done

¿Y si los nombres de los grupos están en un archivo con el formato siguiente?,

GROUP9
GROUP10
GROUP11

En este caso el comando a ejecutar sería algo como,

while read line;do echo "INSERT INTO GROUPS (NAME) VALUES ('$line')" | sqlite3 ejemplo.db;done < groups.txt 

Conclusión

Sencillo pero efectivo ¿no te parece?. Tienes una potente herramienta, sencilla de gestionar y susceptible de gestionar con scripts…


Más información,

Imagen de Michael Schwarzenberger en Pixabay

9 comentarios en “SQLite desde Bash

  1. SY
    Sys hace 2 años

    Hola, felicidades por el artículo y todo lo que haces.
    Quería comentar que a veces en el artículo está escrito «ejemplodb» (cuando tendría que ser «sqlite3 ejemplo.db»). Si se cambia eso, puede que funcionen los ejemplos.

    1. SY
      Sys hace 2 años

      Versión corregida del comentario :-):
      Hola, felicidades por el artículo y todo lo que haces.
      Quería comentar que a veces en el artículo está escrito «ejemplodb» (cuando tendría que ser «ejemplo.db»). Si se cambia eso, puede que funcionen los ejemplos.

    1. AT
      atareao hace 2 años

      He querido poner un ejemplo de for y while, para qu ese vieran todas las opciones.
      Gracias por tu comentario.

      1. SY
        Sys hace 2 años

        En dicho enlace al BashFAQ se explica que el `-r` de `read -r` «prevents backslash interpretation […] Without this option, any unescaped backslashes in the input will be discarded. You should almost always use the `-r` option with `read`. […]».
        También «By default, `read` modifies each line read, by removing all leading and trailing whitespace characters (spaces and tabs, if present in `IFS`). If that is not desired, the `IFS` variable may be cleared, as in the example above».

        > Gracias por tu comentario.
        Gracias de nuevo a ti, ya que eres quien ha hecho la gran parte del trabajo 🙂

    1. SY
      Sys hace 2 años

      Alerta: Si se intenta copiar y pegar el código anterior, se ha de tener en cuenta que este sitio web cambia las comillas inglesas por las españolas… Se puede ver https://www.rae.es/dpd/comillas

  2. SY
    Sys hace 2 años

    > Sencillo pero efectivo ¿no te parece?. Tienes una potente herramienta, sencilla de gestionar y susceptible de gestionar con scripts…
    Sí 🙂 . ¡Gracias!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *