Como formatar corretamente a saída do shell sqlite?

79

Se eu for mysql shelle digitar, SELECT * FROM userseu recebo -

+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+
| 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 shows -

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 shows -

137|X|b@cc.com|#|ADMIN|166|110
138|Kshitiz|ksharma@aaa.com|asdf|ADMIN|167|111
  1. Existe uma maneira de embelezar a saída sqlite shell?
  2. Existe um shell alternativo melhor que a distribuição padrão? (Apenas clientes CLI)
Kshitiz Sharma
fonte
verdadeiramente personalizado formato de saída: stackoverflow.com/questions/23120906/...
Ciro Santilli新疆改造中心法轮功六四事件

Respostas:

114

Para saída "legível por humanos", você pode usar o columnmodo e ativar a saída do cabeçalho. Isso fornecerá algo semelhante à sqlplussaída em seus exemplos:

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
Esteira
fonte
Lindos agradecimentos! O conteúdo não se encaixava (horizontalmente) e não parece haver um pager interno; portanto, tive que usar echo -e '.mode column\n.headers on\nselect * from sip_foo;\n' | sqlite3 database.sqlite | less -Spara obter uma linha por linha sem quebra de linha.
Rob W
5
Observe, no entanto, que você pode precisar usar o .widthcomando para aumentar suas colunas. Caso contrário, seu conteúdo será truncado visualmente.
mlissner 25/09
Você também pode adicionar .separator ROW "\n", para que as linhas sejam separadas por quebras de linha. O meu não era, e a saída era ilegível.
Boxuan
3
Você pode adicionar isso ao seu ~/.sqlitercarquivo se não quiser fazer isso manualmente sempre.
ijoseph
10

Para aqueles que estão interessados ​​em obter os mesmos resultados, exceto executando o sqlite na linha de comando. Eu descobri que o seguinte não 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

Em vez disso, você deve usar as opções -column e -header com o comando sqlite da seguinte maneira:

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

Usando:

$ sqlite3 --version 3.8.11.1 2015-07-29 20:00:57 cf538e2783e468bbc25e7cb2a9ee64d3e0e80b2f
feijão jersey
fonte
1
Embora não haja opção para definir a largura das colunas, é possível a seguinte solução alternativa: echo -e ".headers on \n.mode column \n.width 10 20 500 \n select * from MyTable" | sqlite3 <dbfile>- ou seja, envie os comandos para o stdin.
Ruvim
Eu acho que seu erro foi usar ponto e vírgula em vez de ".headers on\n.mode column\netc
deed02392
@ruvim ou use .mode csvou -csvda CLI
qwr 24/10
10

Todas as respostas fornecem configurações que você pode digitar no console SQLite ou via CLI, mas ninguém menciona que essas configurações podem ser colocadas em um arquivo RC para evitar a necessidade de digitá-las o tempo todo. Salve isso como ~/.sqliterc:

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

Observe que também adicionei um espaço reservado para valores nulos, em vez da sequência vazia padrão.

miken32
fonte
3

Eu sempre uso

.mode line

que imprime os resultados da consulta verticalmente, semelhante ao \Gmodificador do MySQL .

Geoff_Clapp
fonte
1

Como ainda não posso comentar ... Além das ótimas respostas já fornecidas por Mat e mlissner, se, em qualquer caso, o conteúdo de uma coluna estiver truncado, depois de dar o formato correto ao shell do sqlite (usando .mode columne .headers oncomo indicado acima ), também há a possibilidade de usar .explainpara que o conteúdo completo de uma coluna seja mostrado.

A única desvantagem desse comando é que os cabeçalhos das colunas encolhem, não os lendo adequadamente e a saída pode ser bastante confusa (em um cenário visual), então você pode usar .explain offpara retornar ao formato anterior e visualizá-lo com uma aparência mais "humana". legível "mais uma vez.

Essa abordagem pode ser usada em conjunto com os comandos dos formatadores de saída e como uma solução temporária para exibir dados completos de um banco de dados / coluna, pois com o uso de .widthvocê sempre é necessário fornecer o número preciso de caracteres para obter a saída completa de dados de uma coluna.

Para obter mais informações sobre como alterar os formatos de saída, faça uma referência rápida à documentação padrão da CLI:

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

Cho-Lung
fonte
1

A minha parecia uma bagunça sem quebras de linha. @Boxuan comentar sobre

Você também pode adicionar .separator ROW "\ n", para que as linhas sejam separadas por quebras de linha. O meu não era, e a saída era ilegível. - Boxuan 11 de maio às 15:08

Corrigido meu problema com ele tambéminsira a descrição da imagem aqui

superheron
fonte
1
Qual sistema você está usando? no MacOS há tal questão
ospider
1

Você pode usar .mode tabspor conveniência.

sqlite> select * from user;
name    age
Bob     18
Ali     19
Kevin
fonte