在sqlite3 3.19.3中由sqlite3 .dump
或sqlite3
生成的转储文件.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
答案 0 :(得分:1)
sqlite3
命令行shell不被视为SQLite库本身的一部分,并且没有API稳定性保证。
没有选择回到3.18行为。您必须手动还原该更改,或使用您自己的转储程序。