¿Cómo formatear correctamente la salida de shell sqlite?


79

Si voy mysql shelly escribo SELECT * FROM usersme sale -

+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+
| USERID | NAME           | EMAILID                         | PASSWORD | USER_TYPE | CONTACT_ID_FKUSERS | COMPANY_ID_FKUSERS |
+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+
|    137 | X              | b@cc.com                        | #        | ADMIN     |                166 |                110 |
|    138 | Kshitiz        | ksharma@aaa.com                 | asdf     | ADMIN     |                167 |                111 |
+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+

Oracle sqlplus muestra -

USERID     NAME  EMAILID    PASSWORD   USER_TYPE  CONTACT_ID_FKUSERS COMPANY_ID_FKUSERS
---------- ----- ---------- ---------- ---------- ------------------ ------------------
137        X     b@cc.com   #          ADMIN                     166                110
137        X     b@cc.com   #          ADMIN                     166                110

Sqlite shell muestra -

137|X|b@cc.com|#|ADMIN|166|110
138|Kshitiz|ksharma@aaa.com|asdf|ADMIN|167|111
  1. ¿Hay alguna manera de embellecer la salida de sqlite shell?
  2. ¿Existe un shell alternativo que sea mejor que la distribución predeterminada? (Solo clientes CLI)

Respuestas:


114

Para la salida "legible para humanos", puede usar el columnmodo y activar la salida del encabezado. Eso te dará algo similar a la sqlplussalida en tus ejemplos:

sqlite> select * from foo;
234|kshitiz|dba.se
sqlite> .mode column
sqlite> select * from foo;
234         kshitiz     dba.se
sqlite> .headers on
sqlite> select * from foo;
bar         baz         baf
----------  ----------  ----------
234         kshitiz     dba.se

¡Hermosos agradecimientos! El contenido no se ajustaba (horizontalmente), y no parece haber un localizador incorporado, por lo que tuve que usar echo -e '.mode column\n.headers on\nselect * from sip_foo;\n' | sqlite3 database.sqlite | less -Spara obtener una fila por línea sin ajuste de texto.
Rob W

55
Sin embargo, tenga en cuenta que es posible que deba usar el .widthcomando para ampliar las columnas. De lo contrario, su contenido se truncará visualmente.
mlissner

También es posible que desee agregar .separator ROW "\n", para que las filas estén separadas por saltos de línea. El mío no era, y la salida era ilegible.
Boxuan

3
Puede agregar esto a su ~/.sqlitercarchivo si no desea hacerlo manualmente cada vez.
ijoseph

10

Para aquellos que estén interesados ​​en obtener los mismos resultados, excepto ejecutar sqlite desde la línea de comandos. Descubrí que lo siguiente no funciona:

$ sqlite3 <dbfile> ".headers on;.mode column;select * from MyTable"
Error: mode should be one of: ascii column csv html insert line list tabs tcl

En su lugar, debe usar las opciones -column y -header con el comando sqlite de la siguiente manera:

$ sqlite3 -column -header <dbfile> "select * from MyTable"

Utilizando:

$ sqlite3 --version 3.8.11.1 2015-07-29 20:00:57 cf538e2783e468bbc25e7cb2a9ee64d3e0e80b2f

1
Aunque no hay ninguna opción para establecer el ancho de las columnas, es posible la siguiente solución: echo -e ".headers on \n.mode column \n.width 10 20 500 \n select * from MyTable" | sqlite3 <dbfile>- es decir, enviar los comandos al stdin.
ruvim

Creo que su error fue utilizar puntos y comas en lugar de ".headers on\n.mode column\netc.
deed02392

@ruvim o use .mode csvo -csvdesde CLI
qwr

10

Todas las respuestas proporcionan configuraciones que puede escribir en la consola de SQLite o mediante CLI, pero nadie menciona que estas configuraciones se pueden colocar en un archivo RC para evitar tener que escribirlas todo el tiempo. Guarda esto como ~/.sqliterc:

.mode column
.headers on
.separator ROW "\n"
.nullvalue NULL

Tenga en cuenta que también he agregado un marcador de posición para valores nulos, en lugar de la cadena vacía predeterminada.


3

Yo siempre uso

.mode line

que imprime los resultados de la consulta verticalmente, similar al \Gmodificador de MySQL .


1

Como aún no puedo comentar ... Además de las excelentes respuestas ya proporcionadas por Mat y mlissner, si en cualquier caso el contenido de una columna se trunca, después de dar el formato correcto al shell sqlite (usando .mode columny .headers oncomo se indicó anteriormente) ), también existe la posibilidad de usar .explainpara que se muestre el contenido completo de una columna.

El único inconveniente de este comando es que los encabezados de las columnas se reducen, por lo que no los lee correctamente y la salida puede ser bastante desordenada (en un escenario visual), luego puede usar .explain offpara volver al formato anterior y verlo con un "más humano". formato legible "una vez más.

Este enfoque se puede usar junto con los comandos de formateadores de salida, y como una solución temporal para ver los datos completos de una base de datos / columna, ya que con el uso de .widthusted siempre debe proporcionar el número preciso de caracteres para obtener la salida completa de Los datos de una columna.

Para obtener más información sobre cómo cambiar los formatos de salida, una referencia rápida a la documentación de CLI predeterminada:

https://www.sqlite.org/cli.html


1

El mío parecía un desastre sin saltos de línea. @Boxuan comenta sobre

También es posible que desee agregar .separator ROW "\ n", para que las filas estén separadas por saltos de línea. El mío no era, y la salida era ilegible. - Boxuan 11 de mayo a las 15:08

También solucioné mi problema con élingrese la descripción de la imagen aquí


1
¿Qué sistema estás usando? en macOS no hay tal problema
ospider

1

Se puede usar .mode tabspor conveniencia.

sqlite> select * from user;
name    age
Bob     18
Ali     19
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.