Как правильно отформатировать вывод оболочки sqlite?


79

Если я иду mysql shellи печатать, SELECT * FROM usersя получаю -

+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+
| 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 показывает -

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 показывает -

137|X|b@cc.com|#|ADMIN|166|110
138|Kshitiz|ksharma@aaa.com|asdf|ADMIN|167|111
  1. Есть ли способ украсить выход из sqlite shell?
  2. Есть ли альтернативная оболочка, которая лучше дистрибутива по умолчанию? (Только клиенты CLI)

действительно настраиваемый формат вывода: stackoverflow.com/questions/23120906/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Ответы:


115

Для «удобочитаемого» вывода вы можете использовать columnрежим и включить вывод заголовка. Это даст вам нечто похожее на sqlplusвывод в ваших примерах:

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

Большое спасибо! Контент не умещался (по горизонтали), и встроенного пейджера, похоже, не было, поэтому мне пришлось использовать, echo -e '.mode column\n.headers on\nselect * from sip_foo;\n' | sqlite3 database.sqlite | less -Sчтобы получить по одной строке на строку без переноса слов.
Роб W

5
Однако обратите внимание, что вам может понадобиться использовать .widthкоманду, чтобы сделать столбцы шире. В противном случае ваш контент будет обрезан визуально.
mlissner

Вы также можете добавить .separator ROW "\n", чтобы строки разделялись переносами строк. Моего не было, а вывод был нечитабелен.
Boxuan

3
Вы можете добавить это в свой ~/.sqlitercфайл, если вы не хотите делать это каждый раз вручную.
Иосиф

11

Все ответы содержат параметры, которые вы можете ввести на консоли SQLite или через CLI, но никто не упоминает, что эти параметры можно поместить в файл RC, чтобы избежать необходимости их постоянного ввода. Сохранить это как ~/.sqliterc:

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

Примечание. Я также добавил заполнитель для нулевых значений вместо пустой строки по умолчанию.


10

Для тех, кто заинтересован в получении тех же результатов, кроме запуска sqlite из командной строки. Я обнаружил, что следующее не работает:

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

Вместо этого вы должны использовать опции -column и -header с командой sqlite следующим образом:

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

С помощью:

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

1
Хотя нет возможности установить ширину столбцов, возможен следующий обходной путь: echo -e ".headers on \n.mode column \n.width 10 20 500 \n select * from MyTable" | sqlite3 <dbfile>- то есть отправка команд в стандартный ввод.
ruvim

Я думаю, что ваша ошибка заключалась в использовании точек с запятой вместо ".headers on\n.mode column\netc
deed02392

@ruvim или используйте .mode csvили -csvиз CLI
qwr

3

Я всегда использую

.mode line

который печатает результаты запроса вертикально, аналогично \Gмодификатору MySQL .


1

Пока я не могу комментировать ... В дополнение к отличным ответам, уже предоставленным Mat и mlissner, если в любом случае содержимое столбца усекается, после предоставления правильного формата оболочке sqlite (используя .mode columnи .headers onкак указано выше) ), также есть возможность использовать, .explainчтобы отображалось полное содержимое столбца.

Единственным недостатком этой команды является то, что заголовки столбцов сжимаются, поэтому они не читаются должным образом, а выходные данные могут быть довольно грязными (в визуальном сценарии), тогда вы можете использовать, .explain offчтобы вернуться к предыдущему формату и просмотреть его с более «человеческим» читаемый "формат еще раз.

Этот подход можно использовать в сочетании с командами форматирования вывода и в качестве временного решения для просмотра полных данных базы данных / столбца, так как при использовании .widthвы всегда должны указывать точное количество символов, чтобы получить полный вывод данные столбца.

Для получения дополнительной информации об изменении форматов вывода, краткий справочник по документации CLI по умолчанию:

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


1

Мой выглядел как перепутанный без разрывов строк. @Boxuan комментировать

Вы также можете добавить .separator ROW "\ n", чтобы строки разделялись переносами строк. Моего не было, а вывод был нечитабелен. - Boxuan 11 мая в 15:08

Исправлена ​​и моя проблема с этимвведите описание изображения здесь


1
Какую систему вы используете? на macOS такой проблемы нет
ospider

1

Вы можете использовать .mode tabsдля удобства.

sqlite> select * from user;
name    age
Bob     18
Ali     19
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.