Wie formatiere ich die SQLite-Shell-Ausgabe richtig?

79

Wenn ich gehe mysql shellund tippe, SELECT * FROM usersbekomme ich -

+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+
| 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 zeigt an -

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 zeigt an -

137|X|b@cc.com|#|ADMIN|166|110
138|Kshitiz|ksharma@aaa.com|asdf|ADMIN|167|111
  1. Gibt es eine Möglichkeit, die Ausgabe von zu verschönern sqlite shell?
  2. Gibt es eine alternative Shell, die besser ist als die Standardverteilung? (Nur CLI-Clients)
Kshitiz Sharma
quelle
Wirklich benutzerdefiniertes Ausgabeformat: stackoverflow.com/questions/23120906/…
Ciro Santilli Am

Antworten:

113

Für eine "lesbare" Ausgabe können Sie den columnModus verwenden und die Header-Ausgabe aktivieren. Dadurch erhalten Sie eine ähnliche sqlplusAusgabe wie in Ihren Beispielen:

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
Matte
quelle
Schön, danke! Der Inhalt passte nicht (horizontal), und es scheint keinen eingebauten Pager zu geben, sodass ich echo -e '.mode column\n.headers on\nselect * from sip_foo;\n' | sqlite3 database.sqlite | less -Seine Zeile pro Zeile ohne Zeilenumbruch erstellen musste .
Rob W
5
Beachten Sie jedoch, dass Sie möglicherweise den .widthBefehl verwenden müssen, um die Spalten breiter zu machen. Andernfalls wird Ihr Inhalt visuell abgeschnitten.
mlissner
Möglicherweise möchten Sie auch hinzufügen .separator ROW "\n", damit die Zeilen durch Zeilenumbrüche getrennt werden. Meins war nicht, und die Ausgabe war nicht lesbar.
Boxuan
3
Sie können dies zu Ihrer ~/.sqlitercDatei hinzufügen, wenn Sie dies nicht jedes Mal manuell tun möchten.
ijoseph
9

Für diejenigen, die die gleichen Ergebnisse erzielen möchten, mit Ausnahme von SQLite über die Befehlszeile. Ich habe festgestellt, dass Folgendes nicht funktioniert:

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

Stattdessen müssen Sie die Optionen -column und -header mit dem Befehl sqlite wie folgt verwenden:

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

Verwenden von:

$ sqlite3 --version 3.8.11.1 2015-07-29 20:00:57 cf538e2783e468bbc25e7cb2a9ee64d3e0e80b2f
Jerseybohne
quelle
1
Obwohl es keine Option zum Festlegen der Spaltenbreite gibt, ist die folgende Problemumgehung möglich: echo -e ".headers on \n.mode column \n.width 10 20 500 \n select * from MyTable" | sqlite3 <dbfile>- Senden Sie die Befehle an die Standardeingabe.
Ruvim
Ich denke, Ihr Fehler war die Verwendung von Semikolons anstelle von ".headers on\n.mode column\netc
deed02392
9

Alle Antworten enthalten Einstellungen, die Sie an der SQLite-Konsole oder über die CLI eingeben können. Es wird jedoch nicht erwähnt, dass diese Einstellungen in eine RC-Datei eingefügt werden können, damit Sie sie nicht ständig eingeben müssen. Speichern Sie dies als ~/.sqliterc:

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

Hinweis: Anstelle der leeren Standardzeichenfolge habe ich auch einen Platzhalter für Nullwerte hinzugefügt.

miken32
quelle
2

Ich benutze immer

.mode line

Hiermit werden Abfrageergebnisse vertikal ausgegeben, ähnlich wie mit dem \GModifikator von MySQL .

Geoff_Clapp
quelle
1

Wie ich noch nicht kommentieren kann ... Zusätzlich zu den großartigen Antworten, die Mat und mlissner bereits gegeben haben, wird der Inhalt einer Spalte auf jeden Fall abgeschnitten, nachdem der SQLite-Shell das richtige Format gegeben wurde (unter Verwendung von .mode columnund .headers onwie oben angegeben) ) gibt es auch die Möglichkeit, .explaindamit der volle Inhalt einer Spalte angezeigt wird.

Der einzige Nachteil dieses Befehls ist, dass die Spaltenüberschriften kleiner werden und daher nicht richtig gelesen werden und die Ausgabe (in einem visuellen Szenario) ziemlich chaotisch sein kann. Dann können Sie .explain offzum vorherigen Format zurückkehren und es mit einem "menschlicheren" Benutzer anzeigen wieder lesbar "formatieren.

Dieser Ansatz kann in Verbindung mit Ausgabeformatiererbefehlen und als vorübergehende Lösung zum Anzeigen der vollständigen Daten einer Datenbank / Spalte verwendet werden, da bei der Verwendung von .widthimmer die genaue Anzahl von Zeichen angegeben werden muss, um die vollständige Ausgabe von zu erhalten die Daten einer Spalte.

Weitere Informationen zum Ändern von Ausgabeformaten finden Sie in der Standard-CLI-Dokumentation:

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

Cho-Lung
quelle
1

Meins sah aus wie ein Chaos ohne Zeilenumbrüche. @ Boxuan Kommentar zu

Möglicherweise möchten Sie auch .separator ROW "\ n" hinzufügen, damit die Zeilen durch Zeilenumbrüche getrennt werden. Meins war nicht, und die Ausgabe war nicht lesbar. - Boxuan 11. Mai um 15.08 Uhr

Mein Problem wurde ebenfalls behobenBildbeschreibung hier eingeben

Superheld
quelle
1
Welches System verwenden Sie? auf macOS kein solches Problem
ospider
1

Sie können .mode tabsfür die Bequemlichkeit verwenden.

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