Come formattare correttamente l'output della shell sqlite?


79

Se vado mysql shelle digito SELECT * FROM usersottengo -

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

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

137|X|b@cc.com|#|ADMIN|166|110
138|Kshitiz|ksharma@aaa.com|asdf|ADMIN|167|111
  1. C'è un modo per abbellire l'output da sqlite shell?
  2. Esiste una shell alternativa migliore della distribuzione predefinita? (Solo client CLI)

Risposte:


115

Per l'output "leggibile dall'uomo", è possibile utilizzare la columnmodalità e attivare l'uscita dell'intestazione. Questo ti darà qualcosa di simile sqlplusall'output nei tuoi esempi:

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

Bello, grazie! Il contenuto non si adattava (orizzontalmente) e non sembrava esserci un cercapersone incorporato, quindi ho dovuto usare echo -e '.mode column\n.headers on\nselect * from sip_foo;\n' | sqlite3 database.sqlite | less -Sper ottenere una riga per riga senza ritorno a capo automatico.
Rob W

5
Si noti, tuttavia, che potrebbe essere necessario utilizzare il .widthcomando per allargare le colonne. Altrimenti i tuoi contenuti verranno troncati visivamente.
mlissner,

Potresti anche voler aggiungere .separator ROW "\n", in modo che le righe siano separate da interruzioni di riga. Il mio no, e l'output era illeggibile.
Boxuan,

3
Puoi aggiungere questo al tuo ~/.sqlitercfile se non vuoi farlo manualmente ogni volta.
ijoseph,

11

Tutte le risposte forniscono le impostazioni che è possibile digitare sulla console SQLite o tramite l'interfaccia della riga di comando, ma nessuno menziona che queste impostazioni possono essere inserite in un file RC per evitare di doverle digitare sempre. Salva come ~/.sqliterc:

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

Nota Ho anche aggiunto un segnaposto per valori null, anziché la stringa vuota predefinita.


10

Per coloro che sono interessati a ottenere gli stessi risultati, ad eccezione di eseguire sqlite dalla riga di comando. Ho scoperto che il seguente non funziona:

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

Invece, devi usare le opzioni -column e -header con il comando sqlite come segue:

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

usando:

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

1
Sebbene non sia possibile impostare la larghezza delle colonne, è possibile la soluzione seguente: echo -e ".headers on \n.mode column \n.width 10 20 500 \n select * from MyTable" | sqlite3 <dbfile>- ovvero, inviare i comandi allo stdin.
ruvim,

Penso che il tuo errore ".headers on\n.mode column\n
stia

@ruvim o utilizzare .mode csvo -csvdalla CLI
qwr

3

Lo uso sempre

.mode line

che stampa i risultati delle query in verticale, in modo simile al \Gmodificatore di MySQL .


1

Dato che non posso ancora commentare ... Oltre alle grandi risposte già fornite da Mat e mlissner, se in ogni caso il contenuto di una colonna viene troncato, dopo aver dato il formato giusto alla shell sqlite (usando .mode columne .headers oncome indicato sopra ), esiste anche la possibilità di utilizzare in .explainmodo da visualizzare l'intero contenuto di una colonna.

L'unico aspetto negativo di questo comando è che le intestazioni delle colonne si restringono, quindi non le leggono correttamente e l'output può essere piuttosto disordinato (in uno scenario visivo), quindi è possibile utilizzare .explain offper tornare al formato precedente e visualizzarlo con un carattere più "umano" "leggibile" ancora una volta.

Questo approccio può essere utilizzato in combinazione con i comandi di formattazione dell'output e come soluzione temporanea per visualizzare i dati completi di un database / colonna, poiché con l'uso di .widthte devi sempre fornire il numero preciso di caratteri per ottenere l'output completo di i dati di una colonna.

Per ulteriori informazioni sulla modifica dei formati di output, un rapido riferimento alla documentazione CLI predefinita:

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


1

Il mio sembrava un disastro senza interruzioni di linea. @Boxuan commenta

Potresti anche voler aggiungere .separator ROW "\ n", in modo che le righe siano separate da interruzioni di riga. Il mio no, e l'output era illeggibile. - Boxuan, 11 maggio alle 15:08

Risolto anche il mio problemainserisci qui la descrizione dell'immagine


1
Quale sistema stai usando? su macOS nessun problema del genere
ospider

1

Puoi usarlo .mode tabsper comodità.

sqlite> select * from user;
name    age
Bob     18
Ali     19
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.