如何使.sqliterc命令安静?

Ica*_*sNM 13 sqlite

.sqliterc为sqlite3的文件主要是为建议.这.那风格的点命令,比如广受欢迎的MySQL的输出仿真:

.header on
.timer on
.mode column
Run Code Online (Sandbox Code Playgroud)

但是,您可以将所需的任何SQL放入.sqliterc.一旦你意识到sqlite3有多慢,默认情况下,在处理大型数据集时,你会学到一些PRAGMA命令,这些命令可以让生活更美好,比如PRAGMA synchronous = OFF;.

这些命令也可以放在.sqliterc中,如果您了解这些命令会影响您使用命令行"sqlite3"工具执行的所有操作,无论哪个数据库!在我的情况下,这很好.对于我使用,在特定机器上Linux的帐户,我想其中的一些PRAGMA设置,所有的时间.

然而,一些PRAGMA设置产生验证输出,如yesoffexclusivememory.当你做这样的事情时,这就成了一个问题,那些额外的小输出词会被默默地包括在内:

echo "select * from blah;" | sqlite3 foo.db > output.txt
echo "select * from blah;" | sqlite3 foo.db | wc -l
Run Code Online (Sandbox Code Playgroud)

如果你碰巧在.sqliterc中有5个PRAGMA语句,并且其中2个产生输出,那么第二个例子(wc -l)中的行数将会减少两个,而你的数据output.txt并不完全符合你的预期.那些额外的2行stdout不是stderr顺便说一句.

详细说明,使用包含以下内容的.sqliterc文件:

PRAGMA synchronous = OFF;
PRAGMA foreign_keys = ON;
PRAGMA journal_mode = MEMORY;
PRAGMA locking_mode = EXCLUSIVE;
PRAGMA cache_size = -500000;
Run Code Online (Sandbox Code Playgroud)

一切都很好,但你会得到这样的SELECT输出:

off
memory
2904|wan|1417737600|772|108243|0|1946|635589|0
2904|wan|1417737900|765|119478|0|1980|647472|0
2904|wan|1417738200|708|90934|0|1924|622615|0
2904|wan|1417738500|710|105128|0|1914|622634|0
Run Code Online (Sandbox Code Playgroud)

而不是像你想要的那样:

2904|wan|1417737600|772|108243|0|1946|635589|0
2904|wan|1417737900|765|119478|0|1980|647472|0
2904|wan|1417738200|708|90934|0|1924|622615|0
2904|wan|1417738500|710|105128|0|1914|622634|0
Run Code Online (Sandbox Code Playgroud)

看到不同?问题是:我们可以以某种方式使.sqliterc命令闭嘴,并退出打印污染我们的某些PRAGMA命令的结果stdout吗?

Ica*_*sNM 13

答案是肯定的!这是我发现的最好的方式,至少.

警告!这有点hackish,隐藏了一些提示"警告",如果你做了非推荐的将PRAGMA命令放在.sqliterc中的做法,你可能会看到它!

补充工具栏:在研究这个问题时,你可能会被误导.echo on,.echo off但这并不是我们想要的.默认情况下Echo是OFF,这没关系.该.echo设置留给读者练习.

答:使用此.output设置.设置/dev/null为所有命令的输出,然后stdout在最后将输出设置回默认值.(或者使用/tmp/somefile或者你想要的任何东西,如果你想要记录下你的东西.)

固定.sqliterc文件:

.output /dev/null
PRAGMA synchronous = OFF;
PRAGMA foreign_keys = ON;
PRAGMA journal_mode = MEMORY;
PRAGMA locking_mode = EXCLUSIVE;
PRAGMA cache_size = -500000;
.output stdout
Run Code Online (Sandbox Code Playgroud)

现在你可以在输出"wrapper"中包装尽可能多的命令.dotPRAGMA命令,你永远不会被他们无法控制的冗长所困扰!

PS作为奖励,你现在有我推荐的5个性能PRAGMA系列用于使用sqlite3,使用道具来提高SQLite的每秒INSERT性能?.(我的缓存大小为500 MB;尝试季节.)


小智 5

sqlite3 -batch 
Run Code Online (Sandbox Code Playgroud)

让事情安静下来