Notas Sqlite
Notas Sqlite
Notas Sqlite
Rápido. De confianza.
Elige cualquiera de los tres.
Hogar
Sobre
Documentación
Descargar
Licencia
Apoyo
Compra
Búsqueda
1. Primeros pasos
Por ejemplo, para crear una nueva base de datos SQLite llamada "ex1" con una sola tabla llamada
"tbl1", podría hacer lo siguiente:
$ sqlite3 ex1
SQLite versión 3.36.0 2021-06-18 18:36:39
Ingrese ".help" para obtener sugerencias de uso.
sqlite> crear tabla tbl1 (un texto, dos int);
sqlite> insertar en valores tbl1 ('¡hola!', 10);
sqlite> insertar en valores tbl1 ('adiós', 20);
sqlite> seleccione * de tbl1;
hola!|10
adiós|20
sqlite>
Finalice el programa sqlite3 escribiendo el carácter de fin de archivo de su sistema (generalmente
Control-D). Use el carácter de interrupción (generalmente Control-C) para detener una
instrucción SQL de ejecución prolongada.
¡Asegúrese de escribir un punto y coma al final de cada comando SQL! El programa sqlite3 busca
un punto y coma para saber cuándo se completa su comando SQL. Si omite el punto y coma,
sqlite3 le dará un aviso de continuación y esperará a que ingrese más texto para completar el
comando SQL. Esta característica le permite ingresar comandos SQL que abarcan varias
líneas. Por ejemplo:
Los usuarios de Windows pueden hacer doble clic en el icono sqlite3.exe para hacer que el shell
de la línea de comandos muestre una ventana de terminal que ejecuta SQLite. Sin embargo,
debido a que al hacer doble clic se inicia sqlite3.exe sin argumentos de la línea de comandos, no
se habrá especificado ningún archivo de base de datos, por lo que SQLite utilizará una base de
datos temporal que se eliminará cuando finalice la sesión. Para usar un archivo de disco
persistente como base de datos, ingrese el comando ".open" inmediatamente después de que se
inicie la ventana del terminal:
El ejemplo anterior hace que se abra y utilice el archivo de base de datos llamado "ex1.db". El
archivo "ex1.db" se crea si no existe previamente. Es posible que desee utilizar un nombre de ruta
completo para asegurarse de que el archivo se encuentra en el directorio en el que cree que se
encuentra. Utilice barras diagonales como carácter separador de directorio. En otras palabras,
utilice "c:/work/ex1.db", no "c:\work\ex1.db".
Alternativamente, puede crear una nueva base de datos usando el almacenamiento temporal
predeterminado y luego guardar esa base de datos en un archivo de disco usando el comando
".save":
La mayoría de las veces, sqlite3 solo lee líneas de entrada y las pasa a la biblioteca SQLite para
su ejecución. Pero las líneas de entrada que comienzan con un punto (".") son interceptadas e
interpretadas por el propio programa sqlite3. Estos "comandos de puntos" se utilizan
normalmente para cambiar el formato de salida de las consultas o para ejecutar ciertas
declaraciones de consulta preempaquetadas. Originalmente, solo había unos pocos comandos de
puntos, pero a lo largo de los años se han acumulado muchas funciones nuevas, de modo que hoy
en día hay más de 60.
Para obtener una lista de los comandos de puntos disponibles, puede ingresar ".help" sin
argumentos. O ingrese ".help TOPIC" para obtener información detallada sobre TOPIC. La lista
de comandos de puntos disponibles es la siguiente:
sqlite> .ayuda
.archive ... Administrar archivos SQL
.auth ON|OFF Mostrar devoluciones de llamada del autorizador
.backup ?BD? ARCHIVO Base de datos de respaldo (por defecto "principal") a ARCHIVO
.bail on|off Detener después de encontrar un error. DESACTIVADO por defecto
.binary on|off Activa o desactiva la salida binaria. DESACTIVADO por defecto
.cd DIRECTORIO Cambia el directorio de trabajo a DIRECTORIO
.changes on|off Muestra el número de filas cambiadas por SQL
.check GLOB falla si la salida desde .testcase no coincide
.clone NEWDB Clonar datos en NEWDB desde la base de datos existente
.conexión [cerrar] [#] Abre o cierra una conexión de base de datos auxiliar
.databases Lista nombres y archivos de bases de datos adjuntas
.dbconfig ?op? ?val? Listar o cambiar las opciones de sqlite3_db_config()
.dbinfo ?DB? Mostrar información de estado sobre la base de datos
.dump ?OBJETOS? Renderizar el contenido de la base de datos como SQL
.echo on|off Activa o desactiva el comando echo
.eqp on|off|full|... Activar o desactivar automático EXPLICAR CONSULTA PLAN
.excel Muestra el resultado del siguiente comando en la hoja de cálculo
.salir ?CÓDIGO? Salga de este programa con el código de retorno CÓDIGO
.experto EXPERIMENTAL. Sugerir índices para consultas
.explicar ?on|off|auto? Cambia el modo de formato EXPLAIN. Predeterminado: automático
.filectrl CMD ... Ejecutar varias operaciones sqlite3_file_control()
.fullschema ?--guión? Mostrar el esquema y el contenido de las tablas sqlite_stat
.headers on|off Activa o desactiva la visualización de encabezados
.¿ayudar a todos? ?¿PATRÓN? Mostrar texto de ayuda para PATRÓN
.importar ARCHIVO TABLA Importar datos de ARCHIVO a TABLA
.imposter ÍNDICE TABLA Crear tabla impostor TABLA en el índice ÍNDICE
.indexes ?TABLA? Mostrar nombres de índices
.límite ?LÍMITE? ?VAL? Mostrar o cambiar el valor de un SQLITE_LIMIT
.lint OPCIONES Informar posibles problemas de esquema.
.load ARCHIVO ?ENTRADA? Cargar una biblioteca de extensiones
.log FILE|off Activa o desactiva el inicio de sesión. El ARCHIVO puede ser stderr/stdout
.mode MODO ?TABLA? Establecer el modo de salida
.nonce STRING Desactiva el modo seguro para un comando si el nonce coincide
.nullvalue STRING Usa STRING en lugar de valores NULL
.once ?OPCIONES? ?¿EXPEDIENTE? Salida para el siguiente comando SQL solo para ARCHIVO
.abrir ?OPCIONES? ?¿EXPEDIENTE? Cierre la base de datos existente y vuelva a abrir ARCHIVO
.¿archivo de salida? Enviar salida a ARCHIVO o salida estándar si se omite ARCHIVO
.parameter CMD ... Administrar enlaces de parámetros SQL
.print STRING... Imprime STRING literal
.progress N Invocar el controlador de progreso después de cada N opcodes
.prompt PRINCIPAL CONTINUAR Reemplazar las indicaciones estándar
.quit Salir de este programa
.leer ARCHIVO Leer entrada de ARCHIVO
.recover Recupere tantos datos como sea posible de una base de datos corrupta.
.restaurar ?DB? ARCHIVO Restaurar el contenido de la base de datos (predeterminado "principal") desde
ARCHIVO
.save ARCHIVO Escribe la base de datos en memoria en ARCHIVO
.scanstats on|off Activa o desactiva las métricas de sqlite3_stmt_scanstatus()
.schema ?PATRÓN? Muestre las declaraciones CREATE que coincidan con PATTERN
.selftest ?OPCIONES? Ejecutar pruebas definidas en la tabla SELFTEST
.separador COL ?FILA? Cambiar los separadores de columnas y filas
.sesión ?NOMBRE? CMD... Crear o controlar sesiones
.sha3sum ... Calcula un hash SHA3 del contenido de la base de datos
.shell CMD ARGS... Ejecute CMD ARGS... en un shell del sistema
.show Muestra los valores actuales para varias configuraciones
.estadísticas ?ARG? Mostrar estadísticas o activar o desactivar estadísticas
.system CMD ARGS... Ejecute CMD ARGS... en un shell del sistema
.tablas ?TABLA? Listar nombres de tablas que coincidan con el patrón LIKE TABLE
.testcase NOMBRE Comience a redirigir la salida a 'testcase-out.txt'
.testctrl CMD ... Ejecutar varias operaciones sqlite3_test_control()
.timeout MS Intente abrir tablas bloqueadas por MS milisegundos
.timer on|off Activa o desactiva el temporizador SQL
.trace ?OPCIONES? Salida de cada instrucción SQL a medida que se ejecuta
.vfsinfo ?AUX? Información sobre el VFS de nivel superior
.vfslist Lista todos los VFS disponibles
.vfsnombre ?AUX? Imprime el nombre de la pila VFS
.width NUM1 NUM2 ... Establecer anchos de columna mínimos para la salida en columnas
sqlite>
4.1. Estructura de línea
sentencias SQL;
comandos de puntos; o
Comentarios de CLI
Las declaraciones SQL son de forma libre y se pueden distribuir en varias líneas, con espacios en
blanco o comentarios SQL incrustados en cualquier lugar. Terminan con un ';' carácter al final de
una línea de entrada, o un carácter '/' o la palabra "ir" en una línea por sí misma. Cuando no está
al final de una línea de entrada, el ';' los actos de carácter para separar sentencias SQL. Los
espacios en blanco finales se ignoran a efectos de terminación.
Un comando de punto tiene una estructura más restrictiva:
Debe comenzar con su "." en el margen izquierdo sin espacios en blanco anteriores.
Debe estar completamente contenido en una sola línea de entrada.
No puede ocurrir en medio de una instrucción SQL ordinaria. En otras palabras, no puede
ocurrir en un indicador de continuación.
No hay sintaxis de comentarios para los comandos de punto.
La CLI también acepta comentarios de línea completa que comienzan con un carácter '#' y se
extienden hasta el final de la línea. No puede haber ningún espacio en blanco antes del '#'.
Los argumentos pasados a los comandos de punto se analizan desde la cola del comando, según
estas reglas:
Los comandos de puntos son interpretados por el programa de línea de comandos sqlite3.exe, no
por SQLite mismo. Por lo tanto, ninguno de los comandos de punto funcionará como argumento
para las interfaces de SQLite como sqlite3_prepare() o sqlite3_exec() .
El programa sqlite3 puede mostrar los resultados de una consulta en 14 formatos de salida
diferentes:
ascii
caja
CSV
columna
html
insertar
json
línea
lista
reducción
cotizar
mesa
pestañas
tcl
Puede usar el comando de punto ".mode" para cambiar entre estos formatos de salida. El modo de
salida predeterminado es "lista". En el modo de lista, cada fila del resultado de una consulta se
escribe en una línea de salida y cada columna dentro de esa fila está separada por una cadena de
separación específica. El separador predeterminado es un símbolo de tubería ("|"). El modo de
lista es especialmente útil cuando va a enviar el resultado de una consulta a otro programa (como
AWK) para un procesamiento adicional.
sqlite> .modo
modo de salida actual: lista
sqlite>
Use el comando de punto ".separator" para cambiar el separador. Por ejemplo, para cambiar el
separador a una coma y un espacio, podría hacer esto:
En el modo "comilla", la salida se formatea como literales SQL. Las cadenas se encierran entre
comillas simples y las comillas simples internas se escapan mediante la duplicación. Los blobs se
muestran en notación literal de blob hexadecimal (por ejemplo: x'abcd'). Los números se
muestran como texto ASCII y los valores NULL se muestran como "NULL". Todas las columnas
están separadas entre sí por una coma (o cualquier carácter alternativo que se seleccione usando
".separador").
En el modo "línea", cada columna en una fila de la base de datos se muestra en una línea por sí
misma. Cada línea consta del nombre de la columna, un signo igual y los datos de la
columna. Los registros sucesivos están separados por una línea en blanco. Aquí hay un ejemplo
de salida de modo de línea:
uno = adiós
dos = 20
sqlite>
En el modo de columna, cada registro se muestra en una línea separada con los datos alineados en
columnas. Por ejemplo:
En el modo "columna" (y también en los modos "cuadro", "tabla" y "rebaja"), el ancho de las
columnas se ajusta automáticamente. Pero puede anular esto, proporcionando un ancho
especificado para cada columna usando el comando ".width". Los argumentos de ".width" son
números enteros que son el número de caracteres que se dedican a cada columna. Los números
negativos significan justificación a la derecha. De este modo:
sqlite> .width 12 -6
sqlite> seleccionar * de tbl1;
uno dos
------------ ------
¡hola! 10
adiós 20
sqlite>
El modo "columna" es un formato de salida tabular. Otros formatos de salida tabulares son "box",
"markdown" y "table":
sqlite> .width
sqlite> .mode markdown
sqlite> select * from tbl1;
| uno | dos |
|---------|-----|
| ¡hola! | 10 |
| adiós | 20 |
sqlite> .mode table
sqlite> select * from tbl1;
+---------+------+
| uno | dos |
+---------+------+
| ¡hola! | 10 |
| adiós | 20 |
+---------+------+
sqlite> .mode box
sqlite> select * from tbl1;
┌─────────┬─────┐
│ uno │ dos │
├─────────┼─────┤
│ hola! │ 10 │
│ adiós │ 20 │
└─────────┴─────┘
sqlite>
Los modos columnares aceptan algunas opciones adicionales para controlar el formato. La opción
"--wrap N " (donde N es un número entero) hace que las columnas ajusten el texto que tiene más
de N caracteres. El ajuste está deshabilitado si N es cero.
sqlite> insert into tbl1 valores('El veloz zorro salta sobre un perezoso perro marrón.',99);
sqlite> .mode box --wrap 30
sqlite> select * from tbl1 donde dos>50;
┌────────────────────────────────┬─────┐
│ uno │ dos │
├────────────────────────────────┼─── ─
│ El veloz zorro salta sobre un laz │ 90 │
│ y perro marrón. │ │
└────────────────────────────────┴─────┘
sqlite>
El ajuste ocurre exactamente después de N caracteres, que pueden estar en medio de una
palabra. Para ajustar en un límite de palabra, agregue la opción "--wordwrap on" (o simplemente
"-ww" para abreviar):
El comando ".mode box --wrap 60 --quote" es tan útil para consultas de base de datos de
propósito general que se le asigna su propio alias. En lugar de escribir todo ese comando de 27
caracteres, puede simplemente decir ".mode qbox".
Otro modo de salida útil es "insertar". En el modo de inserción, la salida se formatea para
parecerse a las instrucciones SQL INSERT. Use el modo de inserción para generar texto que
luego se puede usar para ingresar datos en una base de datos diferente.
Otros modos de salida incluyen "csv", "json" y "tcl". Pruébelos usted mismo para ver lo que
hacen.
El programa sqlite3 proporciona varios comandos convenientes que son útiles para ver el
esquema de la base de datos. No hay nada que estos comandos hagan que no se pueda hacer por
otros medios. Estos comandos se proporcionan únicamente como acceso directo.
Por ejemplo, para ver una lista de las tablas en la base de datos, puede ingresar ".tables".
sqlite> .tablas
tbl1 tbl2
sqlite>
El comando ".indexes" funciona de manera similar para enumerar todos los índices. Si al
comando ".indexes" se le da un argumento que es el nombre de una tabla, entonces solo muestra
índices en esa tabla.
El comando ".schema" muestra el esquema completo de la base de datos o de una sola tabla si se
proporciona un argumento de nombre de tabla opcional:
sqlite> .schema
crear tabla tbl1 (un varchar (10), dos smallint)
CREAR TABLA tbl2 (
f1 varchar(30) clave principal,
texto f2,
f3 real
);
sqlite> .schema tbl2
CREAR TABLA tbl2 (
f1 varchar(30) clave principal,
texto f2,
f3 real
);
sqlite>
El comando ".schema" es más o menos lo mismo que configurar el modo de lista y luego ingresar
la siguiente consulta:
Al igual que con ".tables", el comando ".schema" muestra el esquema de todas las bases de
datos adjuntas . Si solo desea ver el esquema para una sola base de datos (quizás "principal"),
puede agregar un argumento a ".schema" para restringir su salida:
El comando ".schema" se puede complementar con la opción "--indent", en cuyo caso intenta
reformatear las diversas declaraciones CREATE del esquema para que sean más fáciles de leer
para los humanos.
El comando ".databases" muestra una lista de todas las bases de datos abiertas en la conexión
actual. Siempre habrá al menos 2. El primero es "principal", la base de datos original abierta. La
segunda es "temp", la base de datos utilizada para las tablas temporales. Puede haber bases de
datos adicionales enumeradas para las bases de datos adjuntas mediante la instrucción
ATTACH. La primera columna de resultados es el nombre con el que se adjunta la base de datos
y la segunda columna de resultados es el nombre del archivo externo. Puede haber una tercera
columna de resultados que será "'r/o'" o "'r/w'" dependiendo de si el archivo de la base de datos es
de solo lectura o de lectura y escritura. Y podría haber una cuarta columna de resultados que
muestre el resultado de sqlite3_txn_state() para ese archivo de base de datos.
Si la opción --new se incluye con ".open", la base de datos se restablece antes de abrirse. Todos
los datos anteriores se destruyen. Esta es una sobrescritura destructiva de los datos anteriores y no
se solicita confirmación, así que use esta opción con cuidado.
La opción --readonly abre la base de datos en modo de solo lectura. Se prohibirá escribir.
La opción --deserialize hace que todo el contenido del archivo en disco se lea en la memoria y
luego se abra como una base de datos en memoria mediante
la interfaz sqlite3_deserialize() . Esto, por supuesto, requerirá mucha memoria si tiene una base
de datos grande. Además, los cambios que realice en la base de datos no se guardarán en el disco
a menos que los guarde explícitamente con los comandos ".save" o ".backup".
La opción --append hace que la base de datos SQLite se agregue a un archivo existente en lugar
de funcionar como un archivo independiente. Consulte la extensión appendvfs para obtener más
información.
La opción --zip hace que el archivo de entrada especificado se interprete como un archivo ZIP en
lugar de como un archivo de base de datos SQLite.
La opción --hexdb hace que el contenido de la base de datos se lea desde líneas de entrada
subsiguientes en formato hexadecimal, en lugar de desde un archivo separado en el disco. La
herramienta de línea de comandos "dbtotxt" se puede utilizar para generar el texto apropiado para
una base de datos. La opción --hexdb está diseñada para que la usen los desarrolladores de SQLite
con fines de prueba. No conocemos ningún caso de uso para esta opción fuera de las pruebas y el
desarrollo internos de SQLite.
8. Redirección de E/S
Si los comandos ".output" o ".once" tienen un argumento "-x", eso hace que acumulen la salida
como valores separados por comas (CSV) en un archivo temporal, luego invoque la utilidad del
sistema predeterminada para ver archivos CSV (generalmente un programa de hoja de cálculo) en
el resultado. Esta es una forma rápida de enviar el resultado de una consulta a una hoja de cálculo
para una fácil visualización:
sqlite> .once -x
sqlite> SELECT * FROM bigTable;
En el modo interactivo, sqlite3 lee el texto de entrada (ya sean instrucciones SQL o comandos de
puntos ) desde el teclado. También puede redirigir la entrada de un archivo cuando inicia sqlite3,
por supuesto, pero entonces no tiene la capacidad de interactuar con el programa. A veces es útil
ejecutar un script SQL contenido en un archivo ingresando otros comandos desde la línea de
comandos. Para esto, se proporciona el comando de punto ".read".
El comando ".read" deja de leer temporalmente desde el teclado y en su lugar toma su entrada del
archivo nombrado. Al llegar al final del archivo, la entrada vuelve al teclado. El archivo de
secuencia de comandos puede contener comandos de punto, al igual que la entrada interactiva
ordinaria.
La función SQL readfile(X) lee todo el contenido del archivo llamado X y devuelve ese contenido
como un BLOB. Esto se puede usar para cargar contenido en una tabla. Por ejemplo:
sqlite> CREAR TABLA imágenes (nombre TEXTO, tipo TEXTO, img BLOB);
sqlite> INSERTAR EN imágenes (nombre, tipo, img )
...> VALORES('icono','jpeg',readfile('icono.jpg'));
Tenga en cuenta que las funciones readfile(X) y writefile(X,Y) son funciones de extensión y no
están integradas en la biblioteca central de SQLite. Estas rutinas están disponibles como
una extensión cargable en el archivo fuente ext/misc/fileio.c en los repositorios de código fuente
de SQLite .
La CLI tiene otra función SQL integrada llamada edit(). Edit() toma uno o dos argumentos. El
primer argumento es un valor, a menudo una cadena grande de varias líneas para editar. El
segundo argumento es la invocación de un editor de texto. (Puede incluir opciones para afectar el
comportamiento del editor). Si se omite el segundo argumento, se usa la variable de entorno
VISUAL. La función editar () escribe su primer argumento en un archivo temporal, invoca al
editor en el archivo temporal, vuelve a leer el archivo en la memoria después de que el editor
haya terminado y luego devuelve el texto editado.
La función edit() se puede utilizar para realizar cambios en valores de texto grandes. Por ejemplo:
En este ejemplo, el contenido del campo docs.body para la entrada donde docs.name es "informe-
15" se enviará al editor. Después de que regrese el editor, el resultado se volverá a escribir en el
campo docs.body.
El programa de edición también se puede utilizar como visor, simplemente ignorando el valor de
retorno. Por ejemplo, para simplemente mirar la imagen de arriba, puede ejecutar:
Tenga en cuenta que puede ser importante establecer el "modo" antes de ejecutar el comando
".importar". Esto es prudente para evitar que el shell de la línea de comandos intente interpretar el
texto del archivo de entrada como un formato diferente al de la estructura del archivo. Si se usan
las opciones --csv o --ascii, controlan los delimitadores de entrada de importación. De lo
contrario, los delimitadores son los que están vigentes para el modo de salida actual.
Para importar a una tabla que no está en el esquema "principal", se puede usar la opción --schema
para especificar que la tabla está en algún otro esquema. Esto puede ser útil para bases de datos
ATTACH'ed o para importar a una tabla TEMP.
Aquí hay un ejemplo de uso, cargando una tabla temporal preexistente desde un archivo CSV que
tiene nombres de columna en su primera fila:
8.6. Exportar a CSV
Para exportar una tabla SQLite (o parte de una tabla) como CSV, simplemente configure el
"modo" en "csv" y luego ejecute una consulta para extraer las filas deseadas de la tabla.
sqlite> .headers en
sqlite> .mode csv
sqlite> .once c:/work/dataout.csv
sqlite> SELECT * FROM tab1;
sqlite> .sistema c:/trabajo/dataout.csv
En el ejemplo anterior, la línea ".headers on" hace que las etiquetas de las columnas se impriman
como la primera fila de la salida. Esto significa que la primera fila del archivo CSV resultante
contendrá etiquetas de columna. Si no se desean etiquetas de columna, configure ".headers off" en
su lugar. (La configuración ".headers off" es la predeterminada y se puede omitir si los
encabezados no se han activado previamente).
La línea ".once FILENAME " hace que todos los resultados de la consulta vayan al archivo
indicado en lugar de imprimirse en la consola. En el ejemplo anterior, esa línea hace que el
contenido CSV se escriba en un archivo llamado "C:/work/dataout.csv".
La línea final del ejemplo (el ".system c:/work/dataout.csv") tiene el mismo efecto que hacer
doble clic en el archivo c:/work/dataout.csv en Windows. Esto generalmente abrirá un programa
de hoja de cálculo para mostrar el archivo CSV.
Ese comando solo funciona como está escrito en Windows. La línea equivalente en una Mac
sería:
8.6.1. Exportar a Excel
Para simplificar la exportación a una hoja de cálculo, la CLI proporciona el comando ".excel" que
captura el resultado de una sola consulta y lo envía al programa de hoja de cálculo
predeterminado en la computadora host. Úsalo así:
sqlite> .excel
sqlite> SELECT * FROM tab;
El comando anterior escribe el resultado de la consulta como CSV en un archivo temporal, invoca
el controlador predeterminado para archivos CSV (generalmente el programa de hoja de cálculo
preferido, como Excel o LibreOffice), luego elimina el archivo temporal. Este es esencialmente
un método abreviado para ejecutar la secuencia de comandos ".csv", ".once" y ".system" descrita
anteriormente.
El comando ".excel" es en realidad un alias de ".once -x". La opción -x para .once hace que
escriba los resultados como CSV en un archivo temporal que se nombra con el sufijo ".csv",
luego invoca el controlador predeterminado del sistema para los archivos CSV.
También hay un comando ".once -e" que funciona de manera similar, excepto que nombra el
archivo temporal con un sufijo ".txt" para que se invoque el editor de texto predeterminado para
el sistema, en lugar de la hoja de cálculo predeterminada.
Un archivo ZIP parece ser una base de datos que contiene una sola tabla con el siguiente
esquema:
Entonces, por ejemplo, si quisiera ver la eficiencia de compresión (expresada como el tamaño del
contenido comprimido en relación con el tamaño del archivo original sin comprimir) para todos
los archivos en el archivo ZIP, ordenados desde el más comprimido hasta el menos comprimido,
podría ejecutar un consulta como esta:
sqlite> SELECCIONE nombre, (100.0*longitud(datos sin procesar))/sz DESDE zip ORDEN POR 2;
O usando las funciones de E/S de archivos , puede extraer elementos del archivo ZIP:
El shell de la línea de comandos utiliza la tabla virtual Zipfile para acceder a los archivos
ZIP. Puede ver esto ejecutando el comando ".schema" cuando un archivo ZIP está abierto:
sqlite> .schema
CREAR TABLA VIRTUAL zip USANDO zipfile('document.docx')
/* zip(nombre,modo,mtime,sz,datos sin procesar,datos,método) */;
El procesamiento especial para abrir archivos ZIP es un truco del shell de línea de comandos, no
de la biblioteca central de SQLite. Entonces, si desea abrir un archivo ZIP como una base de
datos en su aplicación, deberá activar el módulo de tabla virtual Zipfile y luego ejecutar una
instrucción CREATE VIRTUAL TABLE adecuada .
Utilice el comando ".dump" para convertir todo el contenido de una base de datos en un único
archivo de texto UTF-8. Este archivo se puede volver a convertir en una base de datos al
canalizarlo nuevamente a sqlite3 .
Una buena manera de hacer una copia de archivo de una base de datos es esta:
Esto genera un archivo llamado ex1.dump.gz que contiene todo lo que necesita para reconstruir
la base de datos en un momento posterior o en otra máquina. Para reconstruir la base de datos,
simplemente escriba:
El formato de texto es SQL puro, por lo que también puede usar el comando .dump para exportar
una base de datos SQLite a otros motores de bases de datos SQL populares. Como esto:
$ createdb ex2
$ sqlite3 ex1 .volcado | psql ex2
Al igual que el comando ".dump", ".recover" intenta convertir todo el contenido de un archivo de
base de datos en texto. La diferencia es que, en lugar de leer los datos mediante la interfaz normal
de la base de datos SQL, ".recover" intenta volver a ensamblar la base de datos en función de los
datos extraídos directamente de tantas páginas de bases de datos como sea posible. Si la base de
datos está dañada, ".recover" generalmente puede recuperar datos de todas las partes no dañadas
de la base de datos, mientras que ".dump" se detiene cuando se encuentra el primer signo de
corrupción.
Si el comando ".recover" recupera una o más filas que no puede atribuir a ninguna tabla de la
base de datos, el script de salida crea una tabla "lost_and_found" para almacenar las filas
huérfanas. El esquema de la tabla lost_and_found es el siguiente:
La tabla "lost_and_found" contiene una fila por cada fila huérfana recuperada de la base de
datos. Además, hay una fila para cada entrada de índice recuperada que no se puede atribuir a
ningún índice SQL. Esto se debe a que, en una base de datos SQLite, se usa el mismo formato
para almacenar entradas de índice SQL y SIN entradas de tabla ROWID.
Columna Contenido
rootpgno Aunque no sea posible atribuir la fila a una tabla de base de datos específica, puede ser parte de u
esa estructura de árbol se almacena en esta columna. O bien, si la página en la que se encontró la
"pgno": el número de página de la página en la que se encontró la fila. En muchos casos, aunque
columna pertenecen a la misma tabla.
identificación Si la fila proviene de una tabla SIN ROWID, esta columna contiene NULL. De lo contrario, cont
c0, c1, c2... Los valores de cada columna de la fila se almacenan en estas columnas. El comando ".recover" c
Si el esquema de la base de datos recuperada ya contiene una tabla denominada
"lost_and_found", el comando ".recover" usa el nombre "lost_and_found0". Si el nombre
"lost_and_found0" también está en uso, "lost_and_found1", y así sucesivamente. El nombre
predeterminado "lost_and_found" se puede anular invocando ".recover" con el modificador --lost-
and-found. Por ejemplo, para que el script de salida llame a la tabla "orphaned_rows":
12. Extensiones de carga
Tenga en cuenta que SQLite agrega automáticamente el sufijo de extensión apropiado (".dll" en
Windows, ".dylib" en Mac, ".so" en la mayoría de los otros Unixes) al nombre del archivo de
extensión. Por lo general, es una buena idea especificar la ruta completa de la extensión.
SQLite calcula el punto de entrada para la extensión en función del nombre del archivo de la
extensión. Para anular esta opción, simplemente agregue el nombre de la extensión como segundo
argumento al comando ".load".
El comando ".sha3sum" toma un solo argumento opcional que es un patrón LIKE . Si esta opción
está presente, solo las tablas cuyos nombres coincidan con el patrón LIKE serán codificadas.
El comando .selftest lee las filas de la tabla de autocomprobación en orden selftest.tno. Para cada
fila de 'memo', escribe el texto en 'cmd' en la salida. Para cada fila 'ejecutar', ejecuta el texto 'cmd'
como SQL y compara el resultado con el valor en 'ans', y muestra un mensaje de error si los
resultados difieren.
El comando ".selftest --init" crea la tabla de autocomprobación si aún no existe, luego agrega
entradas que verifican el hash SHA3 del contenido de todas las tablas. Las ejecuciones posteriores
de ".selftest" verificarán que la base de datos no haya cambiado de ninguna manera. Para generar
pruebas para verificar que un subconjunto de las tablas no ha cambiado, simplemente ejecute
".selftest --init" y luego ELIMINE las filas de autoprueba que se refieren a tablas que no son
constantes.
El comando de punto ".archive" y la opción de línea de comando "-A" brindan soporte integrado
para el formato SQLite Archive . La interfaz es similar a la del comando "tar" en los sistemas
Unix. Cada invocación del comando ".ar" debe especificar una sola opción de comando. Los
siguientes comandos están disponibles para ".archive":
Además de la opción de comando, cada invocación de ".ar" puede especificar una o más opciones
de modificador. Algunas opciones de modificador requieren un argumento, otras no. Las
siguientes opciones de modificador están disponibles:
-f ARCHIVO --archivo ARCHIVO Si se especifica, utilice el archivo ARCHIVO como archivo. De lo contra
-un archivo --añadir ARCHIVO Al igual que --file, use file FILE como el archivo, pero abra el archivo us
-C DIR --directorio DIR Si se especifica, interpreta todas las rutas relativas como relativas a DIR,
-gramo --globo Use glob( Y , X ) para hacer coincidir los argumentos con los nombres en
-norte --dryrun Muestre el SQL que se ejecutaría para llevar a cabo la operación de archi
Para el uso de la línea de comandos, agregue las opciones de línea de comandos de estilo
abreviado inmediatamente después de "-A", sin un espacio intermedio. Todos los argumentos
posteriores se consideran parte del comando .archive. Por ejemplo, los siguientes comandos son
equivalentes:
Las opciones de estilo largo y corto se pueden mezclar. Por ejemplo, los siguientes son
equivalentes:
Alternativamente, el primer argumento que sigue a ".ar" puede ser la concatenación de la forma
abreviada de todas las opciones requeridas (sin los caracteres "-"). En este caso, los argumentos
de las opciones que los requieren se leen a continuación desde la línea de comando y las palabras
restantes se consideran argumentos de comando. Por ejemplo:
Cree un nuevo archivo, sobrescribiendo cualquier archivo existente (ya sea en la base de datos
"principal" actual o en el archivo especificado por una opción --file). Cada argumento que sigue a
las opciones es un archivo para agregar al archivo. Los directorios se importan
recursivamente. Véase más arriba para ver ejemplos.
Extraiga archivos del archivo (ya sea al directorio de trabajo actual o al directorio especificado
por una opción --directory). Se extraen los archivos o directorios cuyos nombres coinciden con
los argumentos, según se vean afectados por la opción --glob. O, si no hay argumentos después de
las opciones, se extraen todos los archivos y directorios. Los directorios especificados se extraen
recursivamente. Es un error si los nombres especificados o los patrones de coincidencia no se
pueden encontrar en el archivo.
-- Extraiga todos los archivos del archivo en la base de datos "principal" actual al
-- directorio de trabajo actual. Muestra los archivos a medida que se extraen.
.ar --extraer --verbose
Los comandos --update y --insert funcionan como --create, excepto que no eliminan el archivo
actual antes de comenzar. Las nuevas versiones de los archivos reemplazan silenciosamente los
archivos existentes con los mismos nombres, pero por lo demás, el contenido inicial del archivo
(si lo hay) permanece intacto.
El comando --remove elimina archivos y directorios que coincidan con los argumentos
proporcionados (si los hay) afectados por la opción --glob. Es un error proporcionar argumentos
que no coincidan con nada en el archivo.
Para ver qué instrucciones SQL se utilizan para implementar una operación de archivo SQLite,
agregue la opción --dryrun o -n. Esto hace que se muestre el SQL pero inhibe la ejecución del
SQL.
Las instrucciones SQL utilizadas para implementar las operaciones de SQLite Archive hacen uso
de varias extensiones cargables . Todas estas extensiones están disponibles en el árbol fuente de
SQLite en la subcarpeta ext/misc/ . Las extensiones necesarias para el soporte completo de
SQLite Archive incluyen:
1. fileio.c : esta extensión agrega funciones SQL readfile() y writefile() para leer y escribir
contenido de archivos en el disco. La extensión fileio.c también incluye la función con
valores de tabla fsdir() para enumerar el contenido de un directorio y la función lsmode()
para convertir enteros numéricos st_mode de la llamada al sistema stat() en cadenas
legibles por humanos al estilo de " comando ls -l".
2. sqlar.c : esta extensión agrega las funciones sqlar_compress() y sqlar_uncompress() que
son necesarias para comprimir y descomprimir el contenido del archivo a medida que se
inserta y extrae de un archivo SQLite.
3. zipfile.c : esta extensión implementa la función con valores de tabla "zipfile(FILE)" que
se utiliza para leer archivos ZIP. Esta extensión solo es necesaria cuando se leen archivos
ZIP en lugar de archivos SQLite.
16. Parámetros SQL
Los parámetros pueden ser con nombre o sin nombre. Un parámetro sin nombre es un solo signo
de interrogación ("?"). Los parámetros con nombre son un "?" seguido inmediatamente por un
número (ej: "?15" o "?123") o uno de los caracteres "$", ":" o "@" seguido de un nombre
alfanumérico (ej: "$var1", ": xyz", "@bingo").
Este shell de línea de comandos deja los parámetros sin nombre sin vincular, lo que significa que
tendrán un valor de SQL NULL, pero a los parámetros con nombre se les pueden asignar
valores. Si existe una tabla TEMP llamada "sqlite_parameters" con un esquema como este:
Y si hay una entrada en esa tabla donde la columna clave coincide exactamente con el nombre del
parámetro (incluido el carácter inicial "?", "$", ":" o "@"), entonces al parámetro se le asigna el
valor del columna de valor Si no existe ninguna entrada, el parámetro predeterminado es NULL.
El comando ".parameter" existe para simplificar la gestión de esta tabla. El comando ".parameter
init" (a menudo abreviado simplemente como ".param init") crea la tabla temp.sqlite_parameters
si aún no existe. El comando ".param list" muestra todas las entradas en la tabla
temp.sqlite_parameters. El comando ".param clear" elimina la tabla temp.sqlite_parameters. Los
comandos ".param set KEY VALUE" y ".param unset KEY" crean o eliminan entradas de la tabla
temp.sqlite_parameters.
El VALOR pasado a ".param set KEY VALUE" puede ser un literal SQL o cualquier otra
expresión o consulta SQL que pueda evaluarse para generar un valor. Esto permite establecer
valores de diferentes tipos. Si dicha evaluación falla, el VALOR proporcionado se cita y se
inserta como texto. Debido a que dicha evaluación inicial puede fallar o no según el valor del
contenido de VALUE, la forma confiable de obtener un valor de texto es incluirlo entre comillas
simples protegidas del análisis de cola de comando descrito anteriormente. Por ejemplo, (a menos
que se pretenda un valor de -1365):
.iniciar parámetro
.parameter set @phoneNumber "'202-456-1111'"
Tenga en cuenta que las comillas dobles sirven para proteger las comillas simples y garantizar
que el texto citado se analice como un argumento.
Para la mayoría de las bases de datos SQL no triviales, la clave del rendimiento es crear los
índices SQL correctos. En este contexto, "los índices SQL correctos" significa aquellos que hacen
que las consultas que una aplicación necesita para optimizar se ejecuten rápidamente. El comando
".expert" puede ayudar con esto proponiendo índices que podrían ayudar con consultas
específicas, si estuvieran presentes en la base de datos.
Primero se emite el comando ".expert", seguido de la consulta SQL en una línea separada. Por
ejemplo, considere la siguiente sesión:
En lo anterior, el usuario crea el esquema de la base de datos (una sola tabla - "x1") y luego usa el
comando ".expert" para analizar una consulta, en este caso "SELECT * FROM x1 WHERE a=?
AND b>? ". La herramienta de shell recomienda que el usuario cree un nuevo índice (índice
"x1_idx_000123a7") y genera el plan que usaría la consulta en formato EXPLAIN QUERY
PLAN . Luego, el usuario crea un índice con un esquema equivalente y vuelve a ejecutar el
análisis en la misma consulta. Esta vez, la herramienta de shell no recomienda ningún índice
nuevo y genera el plan que SQLite usará para la consulta dados los índices existentes.
Opción Objetivo
--verboso Si está presente, genera un informe más detallado para cada consulta analizada.
--muestra El valor predeterminado de este parámetro es 0, lo que hace que el comando ".expert" recom
PORCENTAJE forma en que el planificador de consultas SQLite selecciona índices para consultas si el usu
de datos.
Si a esta opción se le pasa un argumento distinto de cero, el comando ".expert" genera estad
PORCENTAJE de las filas actualmente almacenadas en cada tabla de la base de datos. Para
de índices, especialmente si la aplicación pretende ejecutar ANALYZE.
Para bases de datos pequeñas y CPU modernas, generalmente no hay razón para no pasar "-
tablas de bases de datos grandes. Si la operación es demasiado lenta, intente pasar un valor m
Un esquema de base de datos que incorpore funciones personalizadas de SQL disponibles a través
del mecanismo de carga de extensión puede necesitar una disposición especial para trabajar con la
función .expert. Debido a que la función usa conexiones adicionales para implementar su
funcionalidad, esas funciones personalizadas deben estar disponibles para esas conexiones
adicionales. Esto se puede hacer por medio de las opciones de carga/uso de extensión descritas
en Cargar automáticamente extensiones vinculadas estáticamente y extensiones cargables
persistentes .
Utilice el comando de punto ".conexión" (a menudo abreviado simplemente como ".conn") para
ver una lista de conexiones de bases de datos y una indicación de cuál está actualmente
activa. Cada conexión de base de datos se identifica con un número entero entre 0 y 9. (Puede
haber como máximo 10 conexiones abiertas simultáneamente). Cambie a otra conexión de base
de datos, creándola si aún no existe, escribiendo el comando ".conn" seguido de su número Cierre
una conexión a la base de datos escribiendo ".conn close N", donde N es el número de conexión.
Los comandos de SQLite normalmente terminan con un punto y coma. En la CLI, también puede
usar la palabra "GO" (sin distinción entre mayúsculas y minúsculas) o un carácter de barra
inclinada "/" en una sola línea para finalizar un comando. Estos son utilizados por SQL Server y
Oracle, respectivamente, y son compatibles con la CLI de SQLite para compatibilidad. Estos no
funcionarán en sqlite3_exec() , porque la CLI traduce estas entradas a un punto y coma antes de
pasarlas al núcleo de SQLite.
Hay muchas opciones de línea de comandos disponibles para la CLI. Utilice la opción de línea de
comandos --help para ver una lista:
$ sqlite3 --ayuda
Uso: ./sqlite3 [OPCIONES] NOMBRE DE ARCHIVO [SQL]
FILENAME es el nombre de una base de datos SQLite. Se crea una nueva base de datos.
si el archivo no existe previamente.
Las OPCIONES incluyen:
-A ARGS... ejecuta ".archive ARGS" y sal
-append agrega la base de datos al final del archivo
-ascii establece el modo de salida en 'ascii'
-bail stop después de golpear un error
-batch forzar E/S por lotes
-box establece el modo de salida en 'box'
-columna establece el modo de salida en 'columna'
-cmd COMMAND ejecutar "COMMAND" antes de leer stdin
-csv establece el modo de salida en 'csv'
-deserializar abre la base de datos usando sqlite3_deserialize()
-echo de comandos de impresión antes de la ejecución
-init NOMBRE DE ARCHIVO leer/procesar archivo con nombre
-[no]header activa o desactiva los encabezados
-ayuda mostrar este mensaje
-html establece el modo de salida en HTML
-E/S interactiva de fuerza interactiva
-json establece el modo de salida en 'json'
-línea establece el modo de salida en 'línea'
-list establece el modo de salida en 'lista'
-lookaside SIZE N usa N entradas de SZ bytes para la memoria lookaside
-markdown establece el modo de salida en 'markdown'
-maxsize N tamaño máximo para una base de datos --deserialize
-memtrace rastrea todas las asignaciones y desasignaciones de memoria
-mmap N tamaño predeterminado de mmap establecido en N
-Separador de fila de salida de conjunto de SEP de nueva línea. Valor predeterminado: '\n'
-nofollow se niega a abrir enlaces simbólicos a archivos de base de datos
-nonce STRING establece el nonce de escape en modo seguro
-nullvalue TEXT establece una cadena de texto para valores NULL. Defecto ''
-pagecache SIZE N usa N ranuras de SZ bytes cada una para la memoria caché de página
-quote establece el modo de salida en 'quote'
-readonly abre la base de datos de solo lectura
-seguro habilitar modo seguro
-separador SEP establece el separador de columna de salida. Valor predeterminado: '|'
-stats imprime estadísticas de memoria antes de cada finalización
-tabla establece el modo de salida en 'tabla'
-tabs establece el modo de salida en 'tabs'
-versión muestra la versión de SQLite
-vfs NOMBRE use NOMBRE como el VFS predeterminado
-zip abre el archivo como un archivo ZIP
La CLI es flexible con respecto al formato de opciones de la línea de comandos. Se permiten uno
o dos caracteres "-" iniciales. Por lo tanto, "-box" y "--box" significan lo mismo. Las opciones de
la línea de comandos se procesan de izquierda a derecha. Por lo tanto, una opción "--box" anulará
una opción anterior "--quote".
La mayoría de las opciones de la línea de comandos se explican por sí mismas, pero algunas
merecen una discusión adicional a continuación.
La opción de línea de comandos --safe intenta deshabilitar todas las funciones de la CLI que
podrían causar cambios en la computadora host que no sean cambios en el archivo de base de
datos específico mencionado en la línea de comandos. La idea es que si recibe una secuencia de
comandos SQL grande de una fuente desconocida o que no es de confianza, puede ejecutar esa
secuencia de comandos para ver lo que hace sin correr el riesgo de una explotación utilizando la
opción --safe. La opción --safe desactiva (entre otras cosas):
El comando .open , a menos que se use la opción --hexdb o el nombre del archivo sea
":memory:". Esto evita que el script lea o escriba cualquier archivo de base de datos que
no esté nombrado en la línea de comandos original.
El comando ADJUNTAR SQL.
Funciones SQL que tienen efectos secundarios potencialmente dañinos, como edit(),
fts3_tokenizer(), load_extension(), readfile() y writefile().
El comando .archive .
Los comandos .backup y .save.
El comando .importar .
El comando .load .
El comando .log.
Los comandos .shell y .system.
Los comandos .excel, .once y .output.
Otros comandos que pueden tener efectos secundarios nocivos.
Básicamente, cualquier función de la CLI que lea o escriba desde un archivo en el disco que no
sea el archivo de la base de datos principal está deshabilitada.
Si la opción "--nonce NONCE" también se incluye en la línea de comandos, para una cadena
NONCE grande y arbitraria, entonces el comando ".nonce NONCE" (con la misma cadena nonce
grande) permitirá la siguiente instrucción SQL o punto -comando para eludir las restricciones --
safe.
Suponga que desea ejecutar una secuencia de comandos sospechosa y la secuencia de comandos
requiere una o dos de las funciones que --safe normalmente desactiva. Por ejemplo, suponga que
necesita ADJUNTAR una base de datos adicional. O suponga que el script necesita cargar una
extensión específica. Esto se puede lograr precediendo la instrucción ATTACH (cuidadosamente
auditada) o el comando ".load" con un comando ".nonce" apropiado y proporcionando el mismo
valor nonce usando la opción de línea de comando "--nonce". Esos comandos específicos podrán
ejecutarse normalmente, pero todos los demás comandos inseguros seguirán estando restringidos.
El uso de ".nonce" es peligroso en el sentido de que un error puede permitir que un script hostil
dañe su sistema. Por lo tanto, use ".nonce" con cuidado, con moderación y como último recurso
cuando no haya otras formas de hacer que un script se ejecute en modo --safe.
Para compilar el shell de la línea de comandos en sistemas Unix y en Windows con MinGW,
funciona el comando habitual configure-make:
sh configurar; hacer
El configure-make funciona ya sea que esté construyendo a partir de las fuentes canónicas del
árbol de fuentes o de un paquete combinado. Hay pocas dependencias. Cuando se construye a
partir de fuentes canónicas, se requiere un tclsh de trabajo . Si usa un paquete de amalgamación,
todo el trabajo de preprocesamiento que normalmente realiza tclsh ya se habrá llevado a cabo y
solo se requieren las herramientas de compilación normales.
nmake /f Makefile.msc
Para una operación correcta del comando .archive , haga una copia del código fuente de zlib en el
subdirectorio compat/zlib del árbol fuente y compile de esta manera:
23.1. Construcciones de bricolaje
El código fuente de la interfaz de línea de comandos de sqlite3 se encuentra en un solo archivo
llamado "shell.c". El archivo fuente shell.c se genera a partir de otras fuentes, pero la mayor parte
del código para shell.c se puede encontrar en src/shell.c.in . (Regenere shell.c escribiendo "make
shell.c" del árbol de fuentes canónicas). Compile el archivo shell.c (junto con el código fuente de
la biblioteca sqlite3 ) para generar el ejecutable. Por ejemplo:
-DSQLITE_THREADSAFE=0
-DSQLITE_ENABLE_EXPLAIN_COMMENTS
-DSQLITE_HAVE_ZLIB
-DSQLITE_INTROSPECTION_PRAGMAS
-DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
-DSQLITE_ENABLE_STMTVTAB
-DSQLITE_ENABLE_DBPAGE_VTAB
-DSQLITE_ENABLE_DBSTAT_VTAB
-DSQLITE_ENABLE_OFFSET_SQL_FUNC
-DSQLITE_ENABLE_JSON1
-DSQLITE_ENABLE_RTREE
-DSQLITE_ENABLE_FTS4
-DSQLITE_ENABLE_FTS5