使用Linux,我想比较两个具有相同模式的SQLite数据库.

有没有一个工具可以输出这些差异?

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

推荐答案

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

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

sqldiff [options] database1.sqlite database2.sqlite

如果没有指定选项,那么sqldiff.exe的输出是SQL语句,将database1.sqlite(源数据库)转换为database2.sqlite(目标数据库).

然而,也存在一定的局限性.例如,sqldiff.exe实用程序(至少目前)不会显示触发器、视图或虚拟表中的差异.


Sample command and output

我取了一个简单的键值存储数据库(db1.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由触发器自动更新.然后我又跑了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 download links

自2016年1月20日发布SQLite version 3.10.2以来,sqldiff的32位二进制文件可以直接从SQLite Download Page下载.它们可以在相应操作系统的sqlite tools个档案中找到(参见Precompiled Binaries节).例如,以下是指向3.36.0版sqlite tools个存档的链接:

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

如果你需要64位二进制文件,那么你需要download个原始源代码并自己编译它们.(文件sqldiff.c位于包含源的归档文件的tool子目录中.)

Sql相关问答推荐

如何在T—SQL中找到值更改之前的日期?

在Oracle中,如何删除具有特定值的行,仅当它是重复的行?

如何在snowflake中进行SQL的反向填充

如何在Presto中将多个列合并到一个数组中

根据最大值为字母数字大小写分配数值

从类似JSON的字符串列创建新列

按两列分组,并根据SQL中的条件返回第三个列值

使用特定的Order By子句随机化SQL输出

如何在T-SQL中编写row_number的WHERE子句?

用替代方案替换 SQL Cursor 以提高性能

POSTGRES to_timestamp() 假定 UTC 字符串为本地时间

如何为 ActiveRecord 联接应用附加条件

使用给定的变量对在循环中执行更新语句

如何获得上个月和下个月之间的销售额差异

使用 R 遍历 SQL 查询,每次替换一个变量

如何在 RavenDB Studio (RQL) 中插入更新文档

面对来自以下两个代码的不同输出

查找距上一条记录大于或等于 30 天的记录

BigQuery 错误:SELECT 列表表达式引用 esthetician.LICENSE_TYPE,它既未在 [49:8] 分组也未聚合

为什么这是 AND,OR with NULL 的真值表?