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)

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

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

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.


2

Ich benutze immer

.mode line

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


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


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.