¿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)
Kshitiz Sharma
fuente
formato de salida verdaderamente personalizado: stackoverflow.com/questions/23120906/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

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
Estera
fuente
¡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
frijol jersey
fuente
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.

miken32
fuente
3

Yo siempre uso

.mode line

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

Geoff_Clapp
fuente
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

Cho-Lung
fuente
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í

superheron
fuente
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
Kevin
fuente