SQLite3终端输出格式.width

时间:2013-09-19 18:34:09

标签: sql sqlite terminal formatting

在终端中使用SQLite时,这纯粹是为了让人眼前一亮,但有没有办法用标题格式化列宽,以便每个标题都适当调整大小(并且独立于其他列)?换句话说,这是

的输出
.width auto

表示简单的表格

Id          Name        Price     
----------  ----------  ----------
1           Audi        52642     
2           Mercedes    57127     
3           Skoda       9000      
4           Volvo       29000     
5           Bentley     350000    
6           Citroen     21000     
7           Hummer      41400     
8           Volkswagen  21600 

它符合我的期望。它调整每列的大小,以便显示任何一列中的最长项。但是,我希望自动将输出格式化为使得每列足够宽,以便列中的最长项目。换句话说,我不想输入

.width 2 10 5

获得此输出后

Id  Name        Price
--  ----------  -----
1   Audi        52642
2   Mercedes    57127
3   Skoda       9000 
4   Volvo       29000
5   Bentley     35000
6   Citroen     21000
7   Hummer      41400
8   Volkswagen  21600

我能做些什么来正确自动化列大小调整吗?

8 个答案:

答案 0 :(得分:6)

对于"人类可读"输出,您可以使用column模式,然后打开header输出。这将为您提供类似于示例中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

答案 1 :(得分:3)

来自SQLite的文档:

  

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

答案 2 :(得分:3)

.width的替代名称,请使用别名加上空格。

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

所有列都将使用自动调整宽度,该宽度基于 sqlite documentation width rule:

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

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

  1. “名称”:前20个字符
  2. “年龄”:自动调整
  3. “地址”:前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

答案 3 :(得分:2)

sqlite3工具没有这样的功能。

您必须手动计算列宽(SELECT max(length(col1)) ...)。

答案 4 :(得分:2)

您可以使用简单的awk脚本,例如:

sqlite3 -batch -list db "select ..." awk -F'|' '{printf "%3s %4s %s\n", $1, $2, $3}'

很简单。还比sqlite的列模式更容易,更灵活。

答案 5 :(得分:1)

您可以使用rlwrapcolumn自动执行此操作:

$ rlwrap -a -N -c -z pipeto sqlite3 -header foo.db
> select * from cars; | column -n -t -s '|'

有关详细信息,请参阅我对sqlite3 is chopping/cutting/truncating my text columns的回答。

答案 6 :(得分:0)

我知道这个问题有点老了,但是对于将来的问题,您可以指定所有具有不同长度的输出列的宽度。例如:

sqlite > .width 5 25 15

答案 7 :(得分:-1)

正确答案是: sqlite> .mode 列 sqlite> .width 2 10 5

试一试