所述sqldiff.exe二进制是一个命令行实用程序,显示SQLite数据库之间的差异。用法示例:
sqldiff [选项] database1.sqlite database2.sqlite
通常的输出是一个SQL脚本,它将把database1.sqlite(“源”数据库)转换为database2.sqlite(“目标”数据库)。可以使用命令行开关来更改此行为:
不要将更改写入标准输出。而是将(二进制)变更集文件写入FILE。可以使用SQLite的会话扩展来解释变更集。
在计算差异之前,将共享库或DLL文件LIBRARY加载到SQLite中。这可用于添加架构所需的应用程序定义的 整理序列。
使用模式定义的PRIMARY KEY(而不是rowid)对源数据库和目标数据库中的行进行配对。(请参阅下面的其他说明。)
仅显示架构中的差异,不显示表内容
显示每个表上已更改的行数,但不显示实际的更改
仅显示TABLE的内容差异,而不显示整个数据库的差异
将SQL输出包装在一个大事务中
sqldiff.exe实用程序通过在源和目标中查找逻辑“对”的行来工作。缺省行为是,如果两行位于相同名称的表中且具有相同的rowid,则将它们视为对;如果为WITHOUT ROWID 表,则它们具有相同的PRIMARY KEY时将它们视为对。成对行的内容中的任何差异都将作为UPDATE输出。源数据库中无法配对的行将作为DELETE输出。目标数据库中无法配对的行将作为INSERT输出。
--primarykey标志会稍微改变配对算法,因此,即使在具有rowid的表上,也始终使用模式声明的PRIMARY KEY进行配对。通常,这是查找差异的更好选择,但是,如果行的一个或多个PRIMARY KEY列设置为NULL,则可能导致差异丢失。
sqldiff.exe实用程序不会为以下任何一项计算变更集:无法访问其rowid的rowid表;或没有显式主键的表。给定--changeset选项,sqldiff将从比较中忽略它们。这样的表的示例是:
创建表NilChangeset( -由于隐藏了别名而无法访问rowid “ rowid” TEXT, “ oid” TEXT, “ _rowid_” TEXT );
创建表NilChangeset( -没有明确的主键 “ authorId” TEXT, “ bookId” TEXT );
sqldiff --changeset CHANGESET_OUT --table NilChangeset db1.sdb db2.sdb
默认情况下,不报告虚拟表的架构或内容上的差异。
但是,如果虚拟表实现在数据库中创建实际表(有时称为“影子”表)以存储其数据,则sqldiff.exe会计算两者之间的差。如果生成的SQL脚本随后在与源数据库不完全相同的数据库上运行,则可能会产生令人惊讶的效果。对于SQLite的多个捆绑虚拟表(FTS3,FTS5,rtree等),令人惊讶的影响可能包括虚拟表内容的损坏。
如果将--vtab选项传递给sqldiff.exe,则它将忽略属于FTS3,FTS5或rtree虚拟表的所有基础影子表,而是直接包含虚拟表差异。