sqlite3的 .sqliterc 文件主要建议用于 .this 和 .that 样式的点命令,就像流行的一样mysql输出仿真:
.header on
.timer on
.mode column
但是,你可以把你想要的任何SQL放到.sqliterc中。一旦你意识到 sqlite3 有多慢,默认情况下,在处理大型数据集时,你会学到一些 PRAGMA 命令,这些命令可以让生活更美好,比如PRAGMA synchronous = OFF;
。
这些命令也可以放在.sqliterc中,如果您了解这些命令会影响您使用命令行“sqlite3”工具执行的所有操作,无论哪个数据库!在我的情况下,这很好。对于我正在使用的Linux帐户,在特定的计算机上,我确实想要一些的PRAGMA设置。
但是,某些PRAGMA设置会生成确认输出,例如yes
或off
或exclusive
或memory
。当你做这样的事情时,这就成了一个问题,那些额外的小输出词就会被默默地包括在内:
echo "select * from blah;" | sqlite3 foo.db > output.txt
echo "select * from blah;" | sqlite3 foo.db | wc -l
如果您在.sqliterc中碰巧有5个PRAGMA语句,并且其中2个产生输出,则第二个示例(wc -l
)中的行计数将减去2,而{{1}中的数据将减去并不是你所期望的那样。顺便说一下,额外的2行转到output.txt
,而不是stdout
。
详细说明,包含以下内容的 .sqliterc 文件:
stderr
一切都很好,但你会得到这样的SELECT输出:
PRAGMA synchronous = OFF;
PRAGMA foreign_keys = ON;
PRAGMA journal_mode = MEMORY;
PRAGMA locking_mode = EXCLUSIVE;
PRAGMA cache_size = -500000;
而不是你想要的东西:
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
看到区别?问题是:我们能否以某种方式使 .sqliterc 命令闭嘴,并退出打印污染我们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
的某些 PRAGMA 命令的结果?
答案 0 :(得分:13)
答案是肯定的!这是我发现的最好的方式,至少。
警告!这有点hackish,隐藏了一些提醒"警告"你可能会看到你是否采用非推荐的做法,首先在.sqliterc中放置PRAGMA命令!
补充工具栏:在研究此问题时,您可能会被.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
现在你可以在输出中包装尽可能多的.dot
和PRAGMA
命令" wrapper",你永远不会被他们无法控制的冗长所困扰!
P.S。作为奖励,您现在拥有推荐的5个性能PRAGMA行,用于使用sqlite3,使用道具Improve INSERT-per-second performance of SQLite?。 (我的缓存大小为500 MB;尝试季节。)