小巧、快速、可靠。
任選三項。
sqldiff.exe:資料庫差異工具

1. 用法

二進制檔案 sqldiff.exe 是命令列公用程式,用於顯示 SQLite 資料庫之間的內容差異。範例用法

sqldiff [options] database1.sqlite database2.sqlite

通常的輸出是 SQL 腳本,會將 database1.sqlite(「來源」資料庫)轉換成 database2.sqlite(「目標」資料庫)。此行為可以使用命令列開關進行變更

--changeset 檔案

不要將變更寫入標準輸出。改為將(二進制)變更集檔案寫入檔案。變更集可以使用 SQLite 的 session 擴充功能 來詮釋。

--lib 函式庫
-L 函式庫

在計算差異之前,將共用函式庫或 DLL 檔案函式庫載入 SQLite。這可以用於新增架構所需的應用程式定義 校對順序

--primarykey

使用架構定義的 PRIMARY KEY,而不是 rowid,來配對來源和目標資料庫中的列。(請參閱以下其他說明。)

--schema

只顯示架構中的欄位名稱和資料表差異,不顯示資料表內容

--summary

顯示每個資料表中有多少列已變更,但不要顯示實際變更

--table TABLE

僅顯示 TABLE 內容的差異,而非整個資料庫

--transaction

將 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 會在比較時略過這些表格。以下是這些表格的範例:

    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 工具(目前)不會顯示 TRIGGERVIEW 的差異。

  3. sqldiff 工具並非設計用於支援架構遷移,而且對於不同的欄位定義會寬容。通常,在進行內容比較之前,只會比較同名表格的欄位名稱及其順序。

    但是,單一表格比較選項(指定「sqlite_schema」),可用於顯示或偵測兩個資料庫之間的詳細架構差異。執行此操作時,不應直接使用輸出修改資料庫。

  4. 預設情況下,不會報告虛擬表格的架構或內容差異。

    但是,如果 虛擬表格 實作會在資料庫中建立實體表格(有時稱為「影子」表格)來儲存其資料,則 sqldiff.exe 會計算這些表格之間的差異。如果將產生的 SQL 腳本執行在與原始資料庫完全不同的資料庫上,可能會產生令人驚訝的影響。對於 SQLite 的幾個內建虛擬表格(FTS3、FTS5、rtree 等),令人驚訝的影響可能包括虛擬表格內容的毀損。

    如果將 --vtab 選項傳遞給 sqldiff.exe,則它會忽略屬於 FTS3、FTS5 或 rtree 虛擬表格的所有底層影子表格,而直接包含虛擬表格差異。