Як правильно форматувати вихідний сигнал оболонки sqlite?


77

Якщо я перейду 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 / ...
Чіро Сантіллі新疆改造中心法轮功六四事件

Відповіді:


111

Для вихідних даних, "читаних людиною", ви можете використовувати 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щоб отримати один рядок на рядок без загортання слів.
Роб Ш

5
Однак зауважте, що вам може знадобитися використовувати .widthкоманду, щоб зробити колонки ширшими. Інакше ваш вміст буде візуально урізаний.
mlissner

Ви також можете додати .separator ROW "\n", щоб рядки були розділені перервами рядків. Шахти не було, а вихід був нечитабельним.
Boxuan

3
Ви можете додати це у свій ~/.sqlitercфайл, якщо не хочете робити це вручну кожен раз.
ijoseph

9

Для тих, хто зацікавлений отримати однакові результати, за винятком запуску 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>- тобто, надішліть команди до stdin.
ruvim

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

9

Усі відповіді містять параметри, які можна вводити на консолі SQLite або через CLI, але ніхто не згадує, що ці параметри можна вводити у файл RC, щоб уникнути необхідності постійно їх вводити. Збережіть це як ~/.sqliterc:

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

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


2

Я завжди користуюся

.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", щоб рядки були розділені перервами рядків. Шахти не було, а вихід був нечитабельним. - Боксуан 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.