如果我转到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



是否可以美化sqlite shell的输出?
是否有比默认分发更好的替代shell? (仅限CLI客户)


评论

真正定制的输出格式:stackoverflow.com/questions/23120906/…

#1 楼

对于“人类可读”输出,可以使用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 s中使用echo -e'.mode column \ n.headers on \ nselect * from sip_foo; \ n'| sqlite3 database.sqlite | less -S可以使每行一行而不进行自动换行。

– Rob W
15年8月7日在15:32

但是请注意,您可能需要使用.width命令使列变宽。否则,您的内容将在视觉上被截断。

– mlissner
2015年9月25日23:30在

您可能还需要添加.separator ROW“ \ n”,以使行之间用换行符分隔。我的不是,并且输出不可读。

– Boxuan
17年5月11日在15:08

如果您不想每次都手动执行此操作,可以将其添加到〜/ .sqliterc文件中。

– ijoseph
18年7月2日,0:57

@RobW可以使用-cmd开关添加命令参数,因此无需回显它。像这样:sqlite3 database.sqlite -cmd“ .mode column” -cmd“ .headers on”“从sip_foo中选择*” |少-S

–亚当山
11月10日13:16



#2 楼

所有答案都提供了您可以在SQLite控制台或通过CLI键入的设置,但是没有人提到可以将这些设置放入RC文件中,从而避免了始终都键入这些设置。将其另存为~/.sqliterc

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


请注意,我还为空值添加了占位符,而不是默认的空字符串。

#3 楼

对于那些有兴趣获得相同结果的用户,除了从命令行运行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


相反,您必须在sqlite命令中使用-column和-header选项,如下所示:

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


使用:

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


评论


尽管没有设置列宽的选项,但可以采用以下解决方法:echo -e“ .n上的.headers \ n.mode列\ n.width 10 20 500 \ n select * from MyTable” | sqlite3 -即,将命令发送到stdin。

–ruvim
17年8月24日14:35



我认为您的错误是使用分号而不是“ .headers on \ n.mode列\ n等”

–deed02392
17年11月17日在14:41

@ruvim或从CLI使用.mode csv或-csv

– qwr
19-10-24在21:25

#4 楼

我总是使用

.mode line


垂直打印查询结果,类似于MySQL的\G修饰符。

#5 楼

我还不能发表评论...除了Mat和mlissner已经提供的出色答案之外,在任何情况下,在为sqlite shell提供正确的格式(使用.mode column.headers on作为如上所述),也有可能使用.explain,因此会显示一列的全部内容。输出可能非常混乱(在视觉情况下),然后可以使用.explain off返回以前的格式,并再次使用更具“人类可读性”的格式查看它。

可以使用这种方法与输出格式化程序命令结合使用,以及作为查看数据库/列的完整数据的临时解决方案,如使用.width一样,您始终必须提供准确的字符数才能获得列数据的完整输出。

有关更改输出格式的更多信息,请快速参考o默认的CLI文档:

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

#6 楼

我的看上去像一团糟,没有换行符。 @Boxuan在


上发表评论您可能还想添加.separator ROW“ \ n”,以便行之间用换行符分隔。我的不是,我的输出也不可读。
– Boxuan,5月11日,15:08

评论


您正在使用哪个系统?在macOS上没有这样的问题

–ospider
18年4月9日在2:51

#7 楼

为方便起见,可以使用.mode tabs

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


#8 楼

除了已经说过的所有内容之外,您还可以使用.width控制显示的列的宽度。

示例

.width 8 0 3 9


那么您的输出将显示第一列的宽度为8个字符,第二列自动调整(如下所示),第三列的宽度为3个字符,第四列的宽度为9个字符。

.width,请使用别名名称加空格。

优点是,您仅在查询中动态调整宽度,
那些需要额外宽度的列,其余列将继续使用
自动调整宽度。

所有列将使用自动调整宽度,该宽度基于
sqlite文档宽度规则:


如果您指定宽度为0的列,则该列的宽度会自动
调整为三个数字中的最大值:10,标题的宽度和
第一行数据的宽度。这样可以使列宽自动调整。
每列的默认宽度设置均为此自动调整0值。


假设您的表“ my_table”具有列“名称”,“年龄”和“地址”。
您有兴趣展示:


“名称”:前20个字符
“年龄”:自动调整
“地址”:前30个字符

您的查询将是:

.mode columns
.headers on

CREATE TABLE my_table (name TEXT, age INTEGER, address TEXT);

INSERT INTO my_table VALUES ("short name",
22, "my house");

INSERT INTO my_table VALUES ("my name is very long",
22, "i live in my house somewhere in the planet Earth");

SELECT name AS "name                ",
       age,
       address AS "address                       "
FROM my_table;


您的输出:

name                  age         address                       
--------------------  ----------  ------------------------------
short name            22          my house                      
my name is very long  22          i live in my house somewhere i