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>