该sqldiff.exe二进制文件是一个命令行实用程序,用于显示SQLite数据库之间内容的差异。示例用法
sqldiff [options] database1.sqlite database2.sqlite
通常的输出是一个SQL脚本,它将把database1.sqlite(“源”数据库)转换为database2.sqlite(“目标”数据库)。此行为可以使用命令行开关更改
不要将更改写入标准输出。而是将(二进制)更改集文件写入FILE。可以使用SQLite的会话扩展来解释更改集。
在计算差异之前,将共享库或DLL文件LIBRARY加载到SQLite中。这可用于添加架构所需的应用程序定义的排序规则。
仅显示架构中列名和表的差异,而不是表内容
显示每个表中更改的行数,但不显示实际更改
仅显示TABLE的内容差异,而不是整个数据库
将SQL输出包装在一个大型事务中
sqldiff.exe实用程序通过在源和目标中查找逻辑“配对”的行来工作。默认行为是,如果两行在名称相同的表中并且具有相同的rowid,或者在WITHOUT ROWID表的情况下,如果它们具有相同的主键,则将这两行视为配对。配对行内容的任何差异都将作为UPDATE输出。源数据库中无法配对的行将作为DELETE输出。目标数据库中无法配对的行将作为INSERT输出。
--primarykey标志略微更改了配对算法,以便始终使用架构声明的主键进行配对,即使在具有rowid的表上也是如此。这通常是查找差异的更好选择,但是如果行的一个或多个主键列设置为NULL,则会导致差异遗漏。
sqldiff.exe实用程序不会为以下任何一项计算更改集:rowid不可访问的rowid表;或没有显式主键的表。在给定--changeset选项的情况下,sqldiff会将它们从比较中省略。此类表的示例为
CREATE TABLE NilChangeset ( -- inaccessible rowid due to hiding its aliases "rowid" TEXT, "oid" TEXT, "_rowid_" TEXT );
CREATE TABLE NilChangeset ( -- no explicit primary key "authorId" TEXT, "bookId" TEXT );
sqldiff --changeset CHANGESET_OUT --table NilChangeset db1.sdb db2.sdb
sqldiff实用程序并非旨在支持架构迁移,并且在处理不同的列定义方面具有容错性。通常,仅在进行内容比较之前,比较同名表的列名及其顺序。
但是,可以使用单表比较选项(使用“sqlite_schema”命名)来显示或检测一对数据库之间的详细架构差异。执行此操作时,输出不应直接用于修改数据库。
默认情况下,不会报告虚拟表的架构或内容差异。
但是,如果虚拟表实现创建了数据库中的真实表(有时称为“影子”表)以存储其数据,则sqldiff.exe确实会计算这些表之间的差异。如果生成的SQL脚本随后在与源数据库完全不同的数据库上运行,则这可能会产生意外的影响。对于SQLite的几个捆绑的虚拟表(FTS3、FTS5、rtree等),意外影响可能包括虚拟表内容的损坏。
如果将--vtab选项传递给sqldiff.exe,则它会忽略属于FTS3、FTS5或rtree虚拟表的所有底层影子表,而是直接包含虚拟表差异。