Jak poprawnie sformatować wyjście powłoki sqlite?


77

Jeśli pójdę mysql shelli SELECT * FROM userspiszę, dostaję -

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

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

137|X|b@cc.com|#|ADMIN|166|110
138|Kshitiz|ksharma@aaa.com|asdf|ADMIN|167|111
  1. Czy istnieje sposób na upiększenie wyjścia sqlite shell?
  2. Czy istnieje alternatywna powłoka lepsza niż domyślna dystrybucja? (Tylko klienci CLI)

Odpowiedzi:


111

Aby uzyskać wyjście „czytelne dla człowieka”, możesz użyć columntrybu i włączyć wyjście nagłówka. To da ci coś podobnego do sqlpluswyniku w twoich przykładach:

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

Piękne dzięki! Zawartość nie pasowała (poziomo) i wydaje się, że nie ma wbudowanego pagera, więc musiałem użyć echo -e '.mode column\n.headers on\nselect * from sip_foo;\n' | sqlite3 database.sqlite | less -Sjednego wiersza na wiersz bez zawijania słów.
Rob W

5
Pamiętaj jednak, że może być konieczne użycie .widthpolecenia, aby poszerzyć kolumny. W przeciwnym razie treść zostanie obcięta wizualnie.
mlissner,

Możesz także dodać .separator ROW "\n", aby wiersze były oddzielone podziałami wierszy. Moje nie było, a wynik był nieczytelny.
Boxuan

3
Możesz dodać to do swojego ~/.sqlitercpliku, jeśli nie chcesz tego robić ręcznie za każdym razem.
ijoseph

9

Dla tych, którzy są zainteresowani uzyskaniem tych samych wyników, z wyjątkiem uruchamiania sqlite z wiersza poleceń. Odkryłem, że następujące nie działa:

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

Zamiast tego należy użyć opcji -column i -header z komendą sqlite w następujący sposób:

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

Za pomocą:

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

1
Chociaż nie ma opcji ustawiania szerokości kolumn, możliwe jest następujące obejście: echo -e ".headers on \n.mode column \n.width 10 20 500 \n select * from MyTable" | sqlite3 <dbfile>- tzn. Wysłać polecenia do standardowego wejścia.
ruvim

Myślę, że twój błąd używał średników zamiast ".headers on\n.mode column\netc
deed02392

9

Wszystkie odpowiedzi zawierają ustawienia, które można wpisać w konsoli SQLite lub za pomocą interfejsu CLI, ale nikt nie wspomina, że ​​ustawienia te można umieścić w pliku RC, aby uniknąć konieczności ich ciągłego wpisywania. Zapisz to jako ~/.sqliterc:

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

Uwaga: Dodałem również symbol zastępczy dla wartości null, zamiast domyślnego pustego ciągu.


2

Zawsze używam

.mode line

który wypisuje wyniki zapytania pionowo, podobnie jak \Gmodyfikator MySQL .


1

Ponieważ nie mogę jeszcze komentować ... Oprócz świetnych odpowiedzi już dostarczonych przez Mat i mlissner, jeśli w każdym razie zawartość kolumny jest obcinana, po podaniu odpowiedniego formatu powłoce sqlite (używając .mode columni .headers onjak wspomniano powyżej ), istnieje również możliwość użycia, .explaindzięki czemu wyświetlana jest pełna treść kolumny.

Jedynym minusem tego polecenia jest to, że nagłówki kolumn kurczą się, przez co nie są one odpowiednio odczytywane, a dane wyjściowe mogą być dość nieuporządkowane (w scenariuszu wizualnym), a następnie można .explain offpowrócić do poprzedniego formatu i wyświetlić go z bardziej „ludzkim” czytelny ”format jeszcze raz.

To podejście może być stosowane w połączeniu z poleceniami formatowania wyjściowego i jako tymczasowe rozwiązanie do przeglądania pełnych danych bazy danych / kolumny, ponieważ przy użyciu .widthzawsze trzeba podać dokładną liczbę znaków, aby uzyskać pełne wyjście dane kolumny.

Aby uzyskać więcej informacji na temat zmiany formatów wyjściowych, szybkie odniesienie do domyślnej dokumentacji CLI:

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


1

Mój wyglądał jak pomieszany bez podziałów linii. Skomentuj @Boxuan

Możesz także dodać .separator ROW "\ n", aby wiersze były oddzielone podziałami wierszy. Moje nie było, a wynik był nieczytelny. - Boxuan 11 maja o 15:08

Naprawiłem również mój problem z tymwprowadź opis zdjęcia tutaj


1
Z jakiego systemu korzystasz? na
MacOSie

1

Możesz użyć .mode tabsdla wygody.

sqlite> select * from user;
name    age
Bob     18
Ali     19
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.