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

51

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

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

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

Теги:

5 ответов

47
Лучший ответ

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

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

sqldiff [options] database1.sqlite database2.sqlite

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

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


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

Я взял простую базу данных хранилища db1.sqlite (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

и получил следующий результат:

УДАЛИТЬ ИЗ my_table WHERE rowid = 1;
UPDATE my_table_size SET counter = 0 WHERE rowid = 1;


Ссылки для скачивания sqldiff

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

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

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

  • 0
    Большой! Не могли бы вы добавить пример команды и пример вывода? Спасибо!
  • 1
    @NicolasRaoul: я добавил еще немного информации и результаты моих тестов.
Показать ещё 12 комментариев
48

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

echo .dump | sqlite3 first.sqlite >first.dump
echo .dump | sqlite3 second.sqlite >second.dump
diff first.dump second.dump
  • 0
    Иногда трудно угадать, в какой таблице разница, но сначала я обойдусь без нее. Скрипт awk может показывать таблицу, из которой исходит каждый diff.
  • 0
    Или это ( fmpromigrator.com/products/sqlite_diff/index.html ). ПРИМЕЧАНИЕ: это платный продукт, 25 долларов на момент написания этой статьи, и я НЕ имею никакого отношения к авторам.
Показать ещё 9 комментариев
9

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

  • 0
    Это не работает для sqlite данных, извлеченных из Android
  • 1
    Чем это отличается от встроенного sqldiff умолчанию?
3

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

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

  • 0
    Чем это отличается от встроенного sqldiff умолчанию?
1

С 20 января 2016 года sqldiff (Windows sqldiff.exe) входит в zip файл в http://sqlite.org/download.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню