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

标签 sql linux sqlite

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

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

SQLite 使用 SQL,所以一般的 SQL 工具也可以。

最佳答案

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

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

sqldiff [options] database1.sqlite database2.sqlite

如果未指定任何选项,则 sqldiff.exe 的输出是将 database1.sqlite(“源”数据库)转换为 的 SQL 语句database2.sqlite(“目标”数据库)。

但是,也有一定的限制。例如,sqldiff.exe 实用程序(至少目前)不显示触发器、 View 或虚拟表中的差异。


示例命令和输出

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

sqldiff db1.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;

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

sqldiff db2.sqlite db1.sqlite

得到以下输出:

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


sqldiff 下载链接

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

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

如果您需要 64 位二进制文​​件,则必须 download原始资源并自己编译。 (文件 sqldiff.c 位于包含源文件的 tool 子目录中。)

关于sql - 如何在 Linux 上比较两个 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2093263/

相关文章:

java - hibernate bean 生成器

mysql - 对 2 个表的查询进行计数

java - 在 JDBC 中设置 DB2 DataSource 中的当前模式

iphone - iPhone 上 SQLite 中的临时表存储

html - cordova-sqlite-ext 可以读取 SD 卡(Android)上的数据库吗?

mysql - 确定分组后如何选择记录。 ( rails 3.0)

linux - mktemp : failed to create file via template ‘/tmp/virtualenvwrapper-initialize-hook-XXXXXXXXXX’ : Read-only file system

linux - 获取一个文件的所有者,并将其应用于另一个文件

linux - 使用 docker exec 执行两个命令

java - 使用 sqlite 将字符串读入数据库