如何在Linux上比较两个SQLite数据库

时间:2010-01-19 12:05:31

标签: sql linux sqlite

使用Linux,我想比较具有相同模式的两个SQLite数据库。 只会有一些差异。

是否有可以输出这些差异的工具? 最好将它们输出到命令行,以便我可以grep / sed它们。

SQLite使用SQL,因此一般的SQL工具也可以这样做。

5 个答案:

答案 0 :(得分:53)

请查看2015年5月7日发布的SQLite Release 3.8.10。此版本首次包含用于计算两个SQLite数据库文件之间差异的sqldiff.exe utility program。该程序很可能也将成为未来版本的一部分。

sqldiff.exe 命令行工具应适用于所有受支持的操作系统,并提供多个用于更改其输出行为的开关。用法示例:

sqldiff [options] database1.sqlite database2.sqlite

如果未指定任何选项,则 sqldiff.exe 的输出是将database1.sqlite(" source"数据库)转换为{{1}的SQL语句("目的地"数据库)。

但是,也存在一定的局限性。例如, sqldiff.exe 实用程序(至少当前)不显示TRIGGER,VIEW或虚拟表中的差异。

示例命令和输出

我拿了一个简单的键值存储数据库(database2.sqlite)并制作完成 它的副本(db1.sqlite)。然后我插入一个键值对 db2.sqlite。之后我运行了以下命令:

db2.sqlite

并获得以下输出:

  

INSERT INTO my_table(rowid," key",value)VALUES(1,' D:\ Test \ Test.txt',x' aabbccdd');
  UPDATE my_table_size SET counter = 1 WHERE rowid = 1;

在将键值对插入sqldiff db1.sqlite db2.sqlite 后,表my_table_size由TRIGGER自动更新。然后我再次运行 sqldiff.exe ,但这次使用my_table作为第一个参数,db2.sqlite作为第二个参数:

db1.sqlite

并获得以下输出:

  

DELETE FROM my_table WHERE rowid = 1;
  UPDATE my_table_size SET counter = 0 WHERE rowid = 1;

sqldiff下载链接

自2016年1月20日发布SQLite version 3.10.2以来, sqldiff 的32位二进制文​​件可以直接从SQLite Download Page下载。它们可以在相应操作系统的 sqlite tools 存档中找到(请参阅预编译二进制文件部分)。例如,以下是版本3.28.0的 sqlite工具存档的链接:

对于版本3.10.2之前的SQLite版本,SQLite网站承载 sqldiff 的32位二进制文​​件,但不链接到它们。以下是版本3.8.10的 sqldiff 的链接:

如果您需要64位二进制文​​件,那么您必须download原始资源并自行编译。 (文件 sqldiff.c 位于包含源的存档的工具子目录中。)

答案 1 :(得分:48)

一种可能性是使用sqlite3命令行客户端导出两个数据库,然后区分输出。例如,

sqlite3 first.sqlite .dump >first.dump
sqlite3 second.sqlite .dump >second.dump
diff first.dump second.dump

答案 2 :(得分:9)

仅适用于Windows,但代码项目中有一个免费/开源的SQLite数据库比较应用程序:http://www.codeproject.com/Articles/220018/SQLite-Compare-Utility这对我很有用。

答案 3 :(得分:3)

试试SQLite Diff

注意:这是一个付费产品,在撰写本文时为25美元,而且 与作者有任何关联。

答案 4 :(得分:1)

自2016年1月20日起,sqldiff(Windows sqldiff.exe)包含在http://sqlite.org/download.html

的zip文件中