sqlite3 .dump在转储中插入替换函数(从3.18更改为3.19)

时间:2017-07-08 17:52:52

标签: linux sqlite

在sqlite3 3.19.3中由sqlite3 .dumpsqlite3生成的转储文件.mode insert t_objects(其中t_objects是表的名称)后跟{ {1}}使用SELECT * FROM t_objects;函数作为换行符。请参阅第370行附近的sqlite3文件ext/misc/dbdump.c函数replace

但在sqlite3 3.18中,行为是按原样输出换行符,我更喜欢。

所以3.18我的转储包含:

output_quoted_escaped_string

后来跟着

 CREATE TABLE t_objects
   (ob_id VARCHAR(30) PRIMARY KEY ASC NOT NULL UNIQUE,
    ob_mtim REAL NOT NULL,
    ob_content TEXT NOT NULL,
    ob_paylkind VARCHAR(30) NOT NULL,
    ob_paylinit TEXT NOT NULL,
    ob_paylcontent TEXT NOT NULL);

但是使用3.19.3相同的 INSERT INTO t_objects VALUES('_0UsE4ep7mY5_3M6VTOn9Doe',1497676631.12,' ///$c ','named','c','@NAMEDPROXY: __'); 语句(对于相同的行内容)变为

INSERT

(为了便于阅读,我在第一行的最后一个逗号之后添加了换行符;但它不在那里)

这是documented更改

  

从版本3.19.0(2017-05-22)继续进行的更改:

     

使用replace()而不是char()来转义嵌入在命令行shell的 INSERT INTO t_objects VALUES('_0UsE4ep7mY5_3M6VTOn9Doe',1497676631.1199998855, replace('\n///$c\n\n','\n',char(10)),'named','c','@NAMEDPROXY: __'); 输出中的字符串中的换行符和回车符。

但我不喜欢它(因为我必须写一个专门的转储程序dumpsqlmonimelt.cc

是否有某种方法(例如某些选项或.dump指令)使用sqlite 3.19.3,转储旧的sqlite 3.18行为和格式。

我问的原因是我实际上将转储保存在git(例如此mom_user.sql文件)中,并使用sqlite3转储并通过git pre-commit和{{3}完成恢复}钩子。我真的很喜欢这些新行字符在转储文件中出现(这是我选择post-merge的原因之一,因此有一个sqlite3友好转储。

FWIW git是来自Linux / Debian / Sid / x86-64(包版本3.19.3-3)的那个

附加物

可能会发生sqlite 3.20会改善这个问题(至少对sqlite3而言)。查看其sqlite3和我的release log

1 个答案:

答案 0 :(得分:1)

sqlite3命令行shell不被视为SQLite库本身的一部分,并且没有API稳定性保证。

没有选择回到3.18行为。您必须手动还原该更改,或使用您自己的转储程序。