如何正确格式化sqlite shell输出?


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. 有没有比默认发行版更好的替代shell?(仅限CLI客户)

Answers:


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每行一行而没有自动换行的功能。
罗布W

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

您可能还想添加.separator ROW "\n",以便行之间用换行符分隔。我的不是,并且输出不可读。
Boxuan

3
~/.sqliterc如果不想每次都手动将其添加到文件中,则可以将其添加到文件中。
ijoseph '18

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

相反,必须将sqlite命令与-column和-header选项一起使用,如下所示:

$ 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\netc
deed02392

9

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

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

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



1

我还不能发表评论...除了Mat和mlissner已经提供的出色答案之外,在任何情况下,在为sqlite shell提供正确的格式后,列的内容都会被截断(使用.mode column.headers on如上所述) ),也有可能使用,.explain因此会显示一列的全部内容。

该命令的唯一缺点是,列标题会缩小,因此无法正确读取它们,并且输出可能会非常混乱(在可视情况下),那么您可以使用它.explain off来返回以前的格式并以更“人性化”的方式查看可读”格式。

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

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

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


1

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

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

也解决了我的问题在此处输入图片说明


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

1

您可以.mode tabs使用方便。

sqlite> select * from user;
name    age
Bob     18
Ali     19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.