Как сравнить две базы данных SQLite в Linux

Используя Linux, я хочу сравнить две базы данных SQLite, имеющие одну и ту же схему. Будет только несколько отличий.

Есть ли инструмент, который выводит эти различия? Предпочтительно выводите их в командную строку, чтобы я мог grep/sed их.

SQLite использует SQL, поэтому может также использоваться общий инструмент SQL.

Ответ 1

Ознакомьтесь с SQLite Release 3.8.10, выпущенным 7 мая 2015 года. Этот выпуск впервые содержит служебную программу sqldiff.exe для вычисления различий между два файла базы данных SQLite. Скорее всего, эта программа также будет частью будущих выпусков.

Средство командной строки sqldiff.exe должно работать для всех поддерживаемых операционных систем и предлагает несколько параметров для изменения поведения вывода. Пример использования:

sqldiff [options] database1.sqlite database2.sqlite

Если параметры не указаны, то результатом sqldiff.exe будут операторы SQL, которые преобразуют database1.sqlite (исходную базу данных) в database2.sqlite (целевую базу данных).

Однако есть и определенные ограничения. Например, утилита sqldiff.exe (по крайней мере, в настоящее время) не отображает различия в TRIGGER, VIEW или виртуальных таблицах.


Пример команды и вывод

Я взял простую базу данных хранилища значений ключей (db1.sqlite) и сделал его копия (db2.sqlite). Затем я вставил одну пару ключ-значение в db2.sqlite. После этого я выполнил следующую команду:

sqldiff db1.sqlite db2.sqlite

и получил следующий вывод:

INSERT INTO my_table(rowid,"key",value) VALUES(1,'D:\Test\Test.txt',x'aabbccdd');
UPDATE my_table_size SET counter=1 WHERE rowid=1;

Таблица my_table_size была автоматически обновлена TRIGGER после того, как пара ключ-значение была вставлена в my_table. Затем я снова запустил sqldiff.exe, но на этот раз с db2.sqlite в качестве первого аргумента и db1.sqlite в качестве второго аргумента:

sqldiff db2.sqlite db1.sqlite

и получил следующий вывод:

DELETE FROM my_table WHERE rowid = 1;
ОБНОВЛЕНИЕ my_table_size SET counter = 0 ГДЕ rowid = 1;


sqliff ссылки для скачивания

Начиная с версии SQLite 3.10.2, выпущенной 20 января 2016 года, 32-разрядные двоичные файлы для sqldiff можно напрямую загрузить со страницы загрузки SQLite. Их можно найти в архивах инструментов sqlite для соответствующих операционных систем (см. раздел "Предварительно скомпилированные двоичные файлы"). Например, вот ссылки на архивы инструментов sqlite версии 3.30.1:

Для версий SQLite до версии 3.10.2 веб-сайт SQLite содержит 32-разрядные двоичные файлы для sqldiff, но не ссылается на них. Вот ссылки на sqldiff версии 3.8.10:

Если вам нужны 64-битные двоичные файлы, вам нужно загрузить исходные коды и скомпилировать их самостоятельно. (Файл sqldiff.c находится в подкаталоге инструмента архива, содержащего источники.)

Ответ 2

Одним из возможных вариантов является использование sqlite3 клиента командной строки экспортировать обе базы данных, а затем дифф на выходе. Например,

sqlite3 first.sqlite .dump >first.dump
sqlite3 second.sqlite .dump >second.dump
diff first.dump second.dump

Ответ 3

Это только для Windows, но там есть приложение для сравнения базы данных SQLite с открытым исходным кодом или с открытым исходным кодом в Code Project: http://www.codeproject.com/Articles/220018/SQLite-Compare-Utility, который работает для меня очень хорошо.

Ответ 4

Попробуйте SQLite Diff.

ПРИМЕЧАНИЕ. Это платный продукт, 25 долларов США на момент написания этой статьи, и я не никак не связан с авторами.