小巧。快速。可靠。
三选二。
sqldiff.exe:数据库差异实用程序

1. 使用方法

sqldiff.exe二进制文件是一个命令行实用程序,用于显示SQLite数据库之间内容的差异。示例用法

sqldiff [options] database1.sqlite database2.sqlite

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

--changeset FILE

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

--lib LIBRARY
-L LIBRARY

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

--primarykey

使用架构定义的主键而不是rowid来配对源数据库和目标数据库中的行。(请参阅下面的其他说明。)

--schema

仅显示架构中列名和表的差异,而不是表内容

--summary

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

--table TABLE

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

--transaction

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

--vtab

添加对处理FTS3FTS5rtree虚拟表的支持。请参阅下面了解详细信息。

2. 工作原理

sqldiff.exe实用程序通过在源和目标中查找逻辑“配对”的行来工作。默认行为是,如果两行在名称相同的表中并且具有相同的rowid,或者在WITHOUT ROWID表的情况下,如果它们具有相同的主键,则将这两行视为配对。配对行内容的任何差异都将作为UPDATE输出。源数据库中无法配对的行将作为DELETE输出。目标数据库中无法配对的行将作为INSERT输出。

--primarykey标志略微更改了配对算法,以便始终使用架构声明的主键进行配对,即使在具有rowid的表上也是如此。这通常是查找差异的更好选择,但是如果行的一个或多个主键列设置为NULL,则会导致差异遗漏。

3. 限制

  1. 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被设置为仅比较此类表时,不会发生错误。但是,结果可能出乎意料。例如,此调用的效果
    sqldiff --changeset CHANGESET_OUT --table NilChangeset db1.sdb db2.sdb
    
    将是生成一个名为“CHANGESET_OUT”的空文件。有关详细信息,请参阅会话限制
  2. sqldiff.exe实用程序(目前)不显示触发器视图的差异。

  3. sqldiff实用程序并非旨在支持架构迁移,并且在处理不同的列定义方面具有容错性。通常,仅在进行内容比较之前,比较同名表的列名及其顺序。

    但是,可以使用单表比较选项(使用“sqlite_schema”命名)来显示或检测一对数据库之间的详细架构差异。执行此操作时,输出不应直接用于修改数据库。

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

    但是,如果虚拟表实现创建了数据库中的真实表(有时称为“影子”表)以存储其数据,则sqldiff.exe确实会计算这些表之间的差异。如果生成的SQL脚本随后在与源数据库完全不同的数据库上运行,则这可能会产生意外的影响。对于SQLite的几个捆绑的虚拟表(FTS3、FTS5、rtree等),意外影响可能包括虚拟表内容的损坏。

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