二進制檔案 sqldiff.exe 是命令列公用程式,用於顯示 SQLite 資料庫之間的內容差異。範例用法
sqldiff [options] database1.sqlite database2.sqlite
通常的輸出是 SQL 腳本,會將 database1.sqlite(「來源」資料庫)轉換成 database2.sqlite(「目標」資料庫)。此行為可以使用命令列開關進行變更
不要將變更寫入標準輸出。改為將(二進制)變更集檔案寫入檔案。變更集可以使用 SQLite 的 session 擴充功能 來詮釋。
在計算差異之前,將共用函式庫或 DLL 檔案函式庫載入 SQLite。這可以用於新增架構所需的應用程式定義 校對順序。
使用架構定義的 PRIMARY KEY,而不是 rowid,來配對來源和目標資料庫中的列。(請參閱以下其他說明。)
只顯示架構中的欄位名稱和資料表差異,不顯示資料表內容
顯示每個資料表中有多少列已變更,但不要顯示實際變更
僅顯示 TABLE 內容的差異,而非整個資料庫
將 SQL 輸出包裝在單一大型交易中
sqldiff.exe 程式工具會透過尋找來源和目標中為邏輯「配對」的列來運作。預設行為是,如果兩列位於名稱相同的表格中,且擁有相同的 rowid,則將這兩列視為配對;如果是 WITHOUT ROWID 表格,則在擁有相同的 PRIMARY KEY 時將這兩列視為配對。配對列內容中的任何差異都會輸出為 UPDATE。無法配對的來源資料庫中的列會輸出為 DELETE。無法配對的目標資料庫中的列會輸出為 INSERT。
--primarykey 旗標會稍微變更配對演算法,以便即使在擁有 rowid 的表格上,也會永遠使用架構宣告的 PRIMARY KEY 來進行配對。這通常是尋找差異的較佳選擇,但對於將一個或多個 PRIMARY KEY 欄位設定為 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 虛擬表格的所有底層影子表格,而直接包含虛擬表格差異。