Small. Fast. Reliable.
Choose any three.
sqldiff.exe:数据库差异实用程序

1.用法

所述sqldiff.exe二进制是一个命令行实用程序,显示SQLite数据库之间的差异。用法示例:

sqldiff [选项] database1.sqlite database2.sqlite

通常的输出是一个SQL脚本,它将把database1.sqlite(“源”数据库)转换为database2.sqlite(“目标”数据库)。可以使用命令行开关来更改此行为:

--changeset文件

不要将更改写入标准输出。而是将(二进制)变更集文件写入FILE。可以使用SQLite的会话扩展来解释变更集。

--lib库
-L库

在计算差异之前,将共享库或DLL文件LIBRARY加载到SQLite中。这可用于添加架构所需的应用程序定义的 整理序列

- 首要的关键

使用模式定义的PRIMARY KEY(而不是rowid)对源数据库和目标数据库中的行进行配对。(请参阅下面的其他说明。)

-模式

仅显示架构中的差异,不显示表内容

- 概括

显示每个表上已更改的行数,但不显示实际的更改

--table表格

仅显示TABLE的内容差异,而不显示整个数据库的差异

- 交易

将SQL输出包装在一个大事务中

--vtab

添加对处理FTS3FTS5rtree虚拟表的支持。 有关详情,请参见下文

2.工作原理

sqldiff.exe实用程序通过在源和目标中查找逻辑“对”的行来工作。缺省行为是,如果两行位于相同名称的表中且具有相同的rowid,则将它们视为对;如果为WITHOUT ROWID 表,则它们具有相同的PRIMARY KEY时将它们视为对。成对行的内容中的任何差异都将作为UPDATE输出。源数据库中无法配对的行将作为DELETE输出。目标数据库中无法配对的行将作为INSERT输出。

--primarykey标志会稍微改变配对算法,因此,即使在具有rowid的表上,也始终使用模式声明的PRIMARY KEY进行配对。通常,这是查找差异的更好选择,但是,如果行的一个或多个PRIMARY KEY列设置为NULL,则可能导致差异丢失。

3.局限性

  1. sqldiff.exe实用程序不会为以下任何一项计算变更集:无法访问其rowid的rowid表;或没有显式主键的表。给定--changeset选项,sqldiff将从比较中忽略它们。这样的表的示例是:

    创建表NilChangeset(
       -由于隐藏了别名而无法访问rowid
       “ rowid” TEXT,
       “ oid” TEXT,
       “ _rowid_” TEXT
    );
    
    创建表NilChangeset(
       -没有明确的主键
       “ authorId” TEXT,
       “ bookId” TEXT
    );
    
    使sqldiff仅比较此类表时,不会发生错误。但是,结果可能是意外的。例如,此调用的效果:
    sqldiff --changeset CHANGESET_OUT --table NilChangeset db1.sdb db2.sdb
    
    将产生一个名为“ CHANGESET_OUT”的空文件。有关详细信息,请参见 会话限制
  2. 所述sqldiff.exe实用程序执行中不(目前)显示差异 触发器意见

  3. 默认情况下,不报告虚拟表的架构或内容上的差异。

    但是,如果虚拟表实现在数据库中创建实际表(有时称为“影子”表)以存储其数据,则sqldiff.exe会计算两者之间的差。如果生成的SQL脚本随后在与源数据库不完全相同的数据库上运行,则可能会产生令人惊讶的效果。对于SQLite的多个捆绑虚拟表(FTS3,FTS5,rtree等),令人惊讶的影响可能包括虚拟表内容的损坏。

    如果将--vtab选项传递给sqldiff.exe,则它将忽略属于FTS3,FTS5或rtree虚拟表的所有基础影子表,而是直接包含虚拟表差异。