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
Использовать определенный в схеме PRIMARY KEY вместо rowid для сопоставления строк в исходной и целевой базах данных. (См. дополнительное объяснение ниже.)
- --schema
Показывать только различия в именах столбцов и таблиц в схеме, а не содержимое таблиц
- --summary
Показать количество измененных строк в каждой таблице, но не показывать сами изменения
- --table TABLE
Показать только различия в содержимом для TABLE, а не для всей базы данных
- --transaction
Оборачивает вывод SQL в один большой транзакции
- --vtab
Добавить поддержку работы с FTS3, FTS5 и rtree виртуальными таблицами. См. ниже для получения дополнительных сведений.
2. Принцип работы
Утилита sqldiff.exe работает, находя строки в исходной и целевой базе данных, которые являются логическими «парами». По умолчанию две строки считаются парами, если они находятся в таблицах с одинаковым именем и имеют одинаковый rowid или, в случае таблицы WITHOUT ROWID, если они имеют одинаковый PRIMARY KEY. Любые различия в содержимом пар строк выводятся как UPDATE. Строки из базы данных-источника, которые не были сопоставлены, выводятся как DELETE. Строки из базы данных-назначения, которые не были сопоставлены, выводятся как INSERT.
Флаг --primarykey изменяет алгоритм сопоставления таким образом, что объявленный в схеме PRIMARY KEY всегда используется для сопоставления, даже в таблицах, имеющих rowid. Это часто лучший выбор для поиска различий, однако это может привести к пропускам различий в случае строк, в которых один или несколько столбцов PRIMARY KEY имеют значение NULL.
3. Ограничения
-
Утилита 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». Подробности см. в разделе ограничения сеанса. Утилита sqldiff.exe не (в настоящее время) отображает различия в TRIGGER или VIEW.
-
Утилита sqldiff не предназначена для поддержки миграции схем и терпима к различным определениям столбцов. Обычно имена столбцов и их порядок сравниваются для одноименных таблиц перед сравнением содержимого.
Однако, опция сравнения по отдельной таблице, с именем "sqlite_schema", может быть использована для отображения или обнаружения подробных различий в схемах между парой баз данных. При этом вывод не должен использоваться непосредственно для изменения базы данных.
-
По умолчанию различия в схеме или содержимом виртуальных таблиц не отображаются.
Однако, если реализация виртуальной таблицы создает реальные таблицы (иногда называемые «теневыми» таблицами) в базе данных для хранения своих данных, то sqldiff.exe вычисляет разницу между этими таблицами. Это может иметь неожиданные последствия, если полученный скрипт SQL затем выполняется в базе данных, которая не точно такая же, как база данных-источник. Для некоторых из поставляемых с SQLite виртуальных таблиц (FTS3, FTS5, rtree и др.) неожиданные последствия могут включать повреждение содержимого виртуальной таблицы.
Если опция --vtab передана в sqldiff.exe, то она игнорирует все основополагающие теневые таблицы, принадлежащие виртуальной таблице FTS3, FTS5 или rtree, и вместо этого включает различия в виртуальной таблице напрямую.
SQLite is in the Public Domain.
https://sqlite.org/sqldiff.html