首页
学习
活动
专区
工具
TVP
发布

sqldiff.exe: Database Difference Utility

1.用法

2.它是如何工作的

3.限制

1. Usage

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

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

--schema

仅显示模式中的差异而不显示表格内容

--summary

显示每个表上有多少行已更改,但不显示实际更改

--table TABLE

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

--transaction

将SQL输出封装在单个大型事务中

--vtab

添加对处理FTS3,FTS5和rtree虚拟表的支持。详情请参阅下文。

2. How It Works

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

--primarykey标志稍微改变了配对算法,以便架构声明的PRIMARY KEY总是用于配对,即使在具有rowid的表上也是如此。这通常是找出差异的更好选择,但是它可能导致在将一个或多个PRIMARY KEY列设置为NULL的行的情况下遗漏差异。

3. Limitations

  • sqldiff.exe实用程序无法计算rowid不可访问的rowid表的差异。具有无法访问的rowid的表的示例是:CREATE TABLE inaccessible_rowid(“rowid”TEXT,“oid”TEXT,“_rowid_”TEXT);
  • sqldiff.exe实用程序不会(当前)在TRIGGER或VIEW中显示差异。
  • 默认情况下,不会报告虚拟表的架构或内容的差异。

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

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

 SQLite is in the Public Domain.

扫码关注腾讯云开发者

领取腾讯云代金券