Можно ли сравнить 2 sqlite файла и обновить - PullRequest
0 голосов
/ 14 января 2011

У меня есть 2 sqlite-файла, один старше, у другого новые данные по сравнению с первым. Можно ли сравнить 2 файла sqlite с какой-либо одной командой и выполнить обновление, если есть какая-либо разница?

Приветствую любой комментарий

Спасибо

Ответы [ 3 ]

2 голосов
/ 14 января 2011

Нет единой команды.Но есть некоторые средства сравнения БД SQLite .И вы можете достичь подобного самостоятельно.Я вижу два основных способа.

SQL-способ .Откройте базу данных X, затем присоедините к базе данных Y.Используйте SELECT ... FROM X.sqlite_master, чтобы получить список таблиц базы данных X.Просмотрите список и выполните запрос:

SELECT * FROM x.tab
EXCEPT 
SELECT * FROM y.tab
UNION ALL
SELECT * FROM y.tab
EXCEPT
SELECT * FROM x.tab

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

Путь инструмента .Довольно забавно, но этот подход может быть использован и для ручной синхронизации.Используйте инструмент SQLite.exe.Откройте в нем базу данных X и выполните команды .output и .dump.Повторите то же самое для X базы данных.Используйте такой инструмент, как Beyond Compare, чтобы сравнить оба выхода.

1 голос
/ 14 января 2011

Нет прямой команды для такой функции.

Вы можете использовать триггер, затем создать отдельный список, содержащий «журнал» всех изменений (INSERT / UPDATE / DELETE), внесенных в базу данных, а затем запустить его для старой.

Но если у вас нет возможности установить такой триггер, вам придется прочитать все строки файла, затем проверить, совпадает ли новая строка внутри старой таблицы, и выполнить UPDATE / INSERT / DELETE .

2-е решение будет очень медленным: вам придется читать все новое содержимое, а затем искать содержимое всех строк в старой таблице.

Так что для быстрого решения я вижу только три возможности:

  1. Скопируйте новый файл вместо старого. Это будет быстро и безопасно. Затем запустите VACCUM для экономии места. Но новый файл будет заблокирован во время копирования.
  2. Создайте двоичный файл diff из двух файлов. В некоторых случаях это может быть быстрее. Но новый файл также будет заблокирован во время сравнения.
  3. Если вы не хотите блокировать новый файл, сделайте резервную копию новой таблицы в новый файл. См. Страницу API резервного копирования SQLite . Но если кто-то запишет в новую таблицу, резервное копирование будет перезапущено с самого начала ... так что это тоже не идеально!

Для быстрого бинарного сравнения есть оптимизированный для Delphi модуль (также FOSS) в нашем хранилище исходного кода .

0 голосов
/ 14 января 2011

Вы можете посчитать количество строк, чтобы определить, отличаются ли они, но нетривиально решить, как обновить «старый». Поскольку у вас есть доступ к двум файлам, самый простой способ, imo, если вы просто хотите сделать старую таблицу такой же, как новая, будет:

1) Подсчитать строки. Если старый <новый, то: 2) обрезать старую таблицу 3) Выберите все строки в новой таблице и вставьте их в старую таблицу. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...