B Comandos especiales

El programa "sqlite3.exe" para línea de comandos permite usar sentencias SQL de forma interactiva sobre cualquier base de datos. También dispone de algunos comandos específicos para modificar la forma de las salidas de los comandos, para activar o desactivar algunos parámetros, etc. En este apéndice los veremos en detalle:

Copia de seguridad

.backup [DB] FILE

Realiza una copia de seguridad de la base de datos DB en el fichero FILE. Si no se especifica una base de datos, se hace una copia de la base de datos "main".

Por ejemplo:

sqlite> .databases
seq  name             file
---  ---------------  ----------------------------------------------------------
0    main             C:\programas\ejemplosqlite\agenda.db
1    temp
sqlite> .backup agenda.db agenda.bak
Error: unknown database agenda.db
sqlite> .backup main agenda.bak
sqlite>

Bail

.bail ON|OFF

Detiene la ejecución después de un error. Por defecto está en OFF.

Para ver cómo funciona este comando tenemos que crear un archivo con comandos SQL que después ejecutaremos. Partamos de este ejemplo, en un fichero con el nombre 'prueba.sql':

.echo on
.bail off
create table x(
clave integer,
texto text);
insert into x values(1,"uno");
insert into x values(2,"dos");
inserta into x values(3, "tres");
select * from x;
.quit

Si ejecutamos este fichero desde "sqlite3.exe", la salida es la siguiente:

C:>sqlite3 <prueba.sql
.bail off
create table x(
clave integer,
texto text);
insert into x values(1,"uno");
insert into x values(2,"dos");
Error: near line 8: near "inserta": syntax error
select * from x;
1|uno
2|dos
.quit

Si cambiamos la línea de ".bail" y repetimos la ejecución:

.echo on
.bail on
create table x(
clave integer,
texto text);
insert into x values(1,"uno");
insert into x values(2,"dos");
inserta into x values(3, "tres");
select * from x;
.quit

Si ejecutamos este fichero desde "sqlite3.exe", la salida es la siguiente:

C:>sqlite3 <prueba.sql
.bail on
create table x(
clave integer,
texto text);
insert into x values(1,"uno");
insert into x values(2,"dos");
Error: near line 8: near "inserta": syntax error

De modo que si se encuentra un error, la ejecución se detiene.

Lista de bases de datos

.databases

Lista los nombres y los ficheros correspondientes de las bases de datos abiertas.

sqlite> .databases
.databases
seq  name             file
---  ---------------  ----------------------------------------------------------
0    main             C:\programas\ejemplosqlite\agenda.db
1    temp
sqlite>

Volcado de tablas

.dump [TABLE] ...

Hace un volcado de la tabla TABLE en formato de texto en forma de consultas SQL. Si no se especifica una tabla, se vuelca la base de datos completa. Se pueden especificar varias tablas:

sqlite> .dump usuario
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE usuario(
  claveusuario INT,
  nombre TEXT,
  email TEXT
);
INSERT INTO "usuario" VALUES(1,'Fulano','fulano@dominio.com');
INSERT INTO "usuario" VALUES(2,'Mengano','mengano@dominio.com');
COMMIT;
sqlite>

La tabla puede ser un patrón del tipo que se usa con el operador LIKE.

La salida se puede redirigir a un fichero de texto usando el comando ".output".

sqlite> .output database.txt
sqlite> .dump
sqlite> .output stdout
sqlite>

Activar o desactivar eco

.echo ON|OFF

Activa o desactiva el eco de los comandos introducidos:

sqlite> SELECT CURRENT_DATE;
2012-04-16
sqlite> .echo on
sqlite> SELECT CURRENT_DATE;
SELECT CURRENT_DATE;
2012-04-16
sqlite>

Cerrar el programa

.exit

Sale del programa en línea de comandos.

Cambia el modo de salida

.explain [ON|OFF]

Permite cambiar de salida. Si se activa se muestran encabezados y se tabulan los listados generados por las sentencias SELECT. Si no se especifica un parámetro, se asume que es ON:

sqlite> .explain on
.explain on
sqlite> INSERT INTO usuario VALUES(15, "Filano", "filano@dominio.com");
sqlite> SELECT * FROM usuario;
clav  nombre         emai
----  -------------  ----
1     Fulano         fulano@dominio.com
2     Mengano        mengano@dominio.com
15    Filano         filano@dominio.com
sqlite>

Encabezados de listas

.header(s) ON|OFF

Activa o desactiva los encabezados de las salidas de las selecciones:

sqlite> SELECT * FROM usuario;
1|Fulano|fulano@dominio.com
2|Mengano|mengano@dominio.com
15|Filano|filano@dominio.com
sqlite>

Ayuda

.help

Muestra el listado de comandos especiles, su sintaxis y su función.

Importar desde fichero

.import FILE TABLE

Importa datos desde el fichero FILE a la tabla TABLE.

Supongamos que tenemos un fichero de texto con los datos que queremos insertar en una tabla, cada fila en una fila del fichero, y cada columna separada con el carácter '|'. Los valores de las columnas no están delimitados con comillas:

datos.dat

16|Federico|federico@dominio.com
17|Mauricio|mauricio@dominio.com
18|Casimiro|casimiro@dominio.com

Para importar el contenido del fichero usaremos el comando .import:

sqlite> .import datos.dat usuario
sqlite> SELECT * FROM usuario;
clav  nombre         emai
----  -------------  ----
1     Fulano         fulano@dominio.com
2     Mengano        mengano@dominio.com
15    Filano         filano@dominio.com
16    Federico       federico@dominio.com
17    Mauricio       mauricio@dominio.com
18    Casimiro       casimiro@dominio.com
sqlite>

Mostrar índices

.indices [TABLE]

Muestra los nombres de todos los índices. Si se especifica una tabla, sólo se muestran los índices de la tabla indicada, o de las tablas que se ajusten al patrón, los patrones se crean igual que con el operador LIKE, un '_' indica un caracter y '%' una cadena de 1 ó más caracteres:

sqlite> CREATE INDEX nombre on usuario(nombre);
sqlite> .indices
nombre
sqlite> .indices us%
nombre
sqlite>

Cargar una librería

.load FILE [ENTRY]

Permite cargar una librería de extensión de SQLite. Estas librerías se crean en C y permiten definir nuevas funciones que se pueden usar en consultas SQLite.

Archivo de registro

.log FILE|off

Activa un archivo de registro, si se especifica un nombre de archivo en FILE. El fichero puede ser stderr o stdout. Para desactivarlo usar .log off.

sqlite> .log database.log
sqlite> CREATE INDEX nombre on usuario(nombre);
Error: index nombre already exists
sqlite> .log off
sqlite>

El fichero "database.log" queda así:

C:\programas\ejemplosqlite>type database.log
(1) index nombre already exists

Cambiar el modo de salida

.mode MODE [TABLE]

Permite seleccionar varios modos de salida, donde MODE puede tomar cualquiera de los siguientes valores:

  • csv: valores separados por comas
  • column: columnas alineadas a la izquierda. Se puede especificar el ancho de cada columna con el comando .width
  • html: formato HTML para tablas
  • insert: sentencias de inserción SQL insert para la tabla indicada
  • line: un valor en cada línea
  • list: valores delimitados por el separador definido mediante el comando .separator cadena
  • tabs: valores separados por tabuladores
  • tcl: elementos de lista TCL

Por ejemplo, veamos la salida en modo tabs:

sqlite> .mode tabs
sqlite> SELECT * FROM usuario;
claveusuario    nombre  email
1       Fulano  fulano@dominio.com
2       Mengano mengano@dominio.com
15      Filano  filano@dominio.com
sqlite> 

Nullvalue

.nullvalue STRING

Permite especificar la cadena que se mostrará en lugar de los valores NULL.

sqlite> INSERT into usuario (claveusuario,nombre) values(20, "Cucufato");
sqlite> SELECT * FROM usuario WHERE claveusuario=20;
claveusuario,nombre,email
20,Cucufato,
sqlite> .nullvalue (nulo)
sqlite> SELECT * FROM usuario WHERE claveusuario=20;
claveusuario,nombre,email
20,Cucufato,(nulo)
sqlite>

Output

.output FILENAME

Envía la salida al fichero indicado por FILENAME. Si se quiere volver a enviar la salida a la pantalla usar "stdout" como nombre de fichero.

Cambiar el prompt

.prompt MAIN [CONTINUE]

Reemplaza el prompt por defecto. El primer parámetro es el prompt principal, que por defecto es "sqlite> ". El segundo es opcional, y es el prompt que se muestra cuando la sentencia no está completa, por defecto es "...> ".

sqlite> .prompt "comando> " "sigue> "
comando> SELECT *
sigue> FROM usuario;
claveusuario,nombre,email
1,Fulano,fulano@dominio.com
...

Salir del programa

.quit

Abandona el programa en línea de comandos.

Ejecutar un fichero SQL

.read FILENAME

Ejecuta un fichero externo con sentencias SQL.

Restaurar base de datos

.restore [DB] FILE

Restaura el contenido de una base de datos DB o de la base de datos "main" si se omite el parámetro, desde un fichero FILE generado mediante .backup.

sqlite> .restore main agenda.bak
sqlite> SELECT * from usuario;
claveusuario,nombre,email
1,Fulano,fulano@dominio.com
2,Mengano,mengano@dominio.com
sqlite>

Esquema de base de datos

.schema [TABLE]

Muestra las sentencias CREATE usadas para crear las tablas de la base de datos, o las de las tablas especificadas mediante el patrón TABLE. El patrón se ajusta a las mismas reglas que el operador LIKE.

sqlite> .schema usuario
CREATE TABLE usuario(
  claveusuario INT,
  nombre TEXT,
  email TEXT
);
sqlite>

Definir separadores

.separator STRING

Cambia el separador usado por el modo de salida y en el comando .import.

sqlite> .separator "#~$"
sqlite> .mode list
sqlite> SELECT * FROM usuario;
claveusuario#~$nombre#~$email
1#~$Fulano#~$fulano@dominio.com
2#~$Mengano#~$mengano@dominio.com
sqlite>

Valores de opciones

.show

Muestra los valores actuales de algunas de las opciones de configuración.

sqlite> .show
     echo: off
  explain: on
  headers: on
     mode: list
nullvalue: "(nulo)"
   output: stdout
separator: "#~$"
    stats: off
    width: 4 13 4 4 4 13 2 13
sqlite>

Activar estadísticas

.stats ON|OFF

Activa (on) o desactiva (off) las estadísticas de SQLite:

sqlite> .stats on
sqlite> INSERT INTO usuario VALUES(3,"Tulano","tulano@dominio.com");
Memory Used:                         65336 (max 123312) bytes
Number of Allocations:               113 (max 167)
Number of Pcache Overflow Bytes:     8872 (max 17744) bytes
Number of Scratch Overflow Bytes:    0 (max 0) bytes
Largest Allocation:                  48000 bytes
Largest Pcache Allocation:           1160 bytes
Largest Scratch Allocation:          0 bytes
Lookaside Slots Used:                6 (max 83)
Pager Heap Usage:                    8720 bytes
Schema Heap Usage:                   1904 bytes
Statement Heap/Lookaside Usage:      1648 bytes
Fullscan Steps:                      0
Sort Operations:                     0
Autoindex Inserts:                   0
sqlite>

Lista de tablas

.tables [TABLE]

Lista los nombres de las tablas en todas las bases de datos abiertas. Si se especifica el parámetro TABLE se mostrarán únicamente los nombres de las tablas que se ajusten al patrón indicado. El patrón tiene la misma sintaxis que el operador LIKE.

sqlite> CREATE TEMP TABLE user(
...> clave INTEGER,
...> nombre TEXT);
sqlite> .tables
telefono   telefono2  user       usuario
sqlite>

Definir tiempo límite

.timeout MS

Permite definir el tiempo máximo durante el que se intentarán abrir las tablas bloquedas, en milisegundos.

Anchura de columnas

.width NUM1 NUM2 ...

Asigna las anchuras de las columnas en los listados de modo columna:

sqlite> .mode column
sqlite> .width 3 25 20
sqlite> SELECT * FROM usuario;
cla  nombre                     email
---  -------------------------  --------------------
1    Fulano                     fulano@dominio.com
2    Mengano                    mengano@dominio.com
3    Tulano                     tulano@dominio.com
sqlite>

Medida de tiempos

.timer ON|OFF

Activa o desactiva la medida de tiempo de CPU:

sqlite> SELECT * FROM usuario;
cla  nombre                     email
---  -------------------------  --------------------
1    Fulano                     fulano@dominio.com
2    Mengano                    mengano@dominio.com
3    Tulano                     tulano@dominio.com
CPU Time: user 0.000000 sys 0.000000
sqlite>
sqlite> SELECT * FROM usuario;
cla  nombre                     email
---  -------------------------  --------------------
1    Fulano                     fulano@dominio.com
2    Mengano                    mengano@dominio.com
3    Tulano                     tulano@dominio.com
CPU Time: user 0.000000 sys 0.000000
sqlite>