Как управлять версиями файловых баз рабочего стола?
Как управлять изменениями базы данных при обновлении настольных приложений?
У нас есть база данных SQLite для одного из наших настольных приложений. Деинсталлятор сохраняет базу данных для использования при следующей установке. Но что, если у следующей установки будет обновленная версия? Как сохранить данные, но обновить таблицы?
Мы используем.NET и Linq2sql
2 ответа
Вот как я это делаю:
В моем коде я определяю версию базы данных
#define DB_VERSION 2
Этот номер версии увеличивается каждый раз, когда я изменяю код, который "ломает" базу данных (вносит несовместимые изменения в схему или семантику содержимого базы данных)
Когда код создает новую базу данных, он выполняет эту команду SQL
QueryFormat(L"PRAGMA SCHEMA_VERSION = %d;",DB_VERSION);
Обратите внимание, что это должно быть ПОСЛЕ того, как были выполнены все команды CREATE TABLE, в противном случае sqlite увеличивает SCHEMA_VERSION.
Когда код открывает существующую базу данных, первое, что он делает, это
Query(L"PRAGMA schema_version;")
SCHEMA_VERSION, который возвращается из этого запроса, сравнивается с DB_VERSION. Если они не совпадают, то база данных была создана другой версией программного обеспечения. Что будет дальше, зависит от того, что вам нужно. Как правило:
база данных была создана более новым программным обеспечением: сообщите пользователю и выйдите
база данных была создана более старым программным обеспечением, для которого существует обновление: предложите пользователю запустить код обновления или повторно инициализировать базу данных
база данных была создана старым программным обеспечением без обновления: предложите пользователю возможность повторно инициализировать базу данных или выйти.
Детали того, как работает код обновления, очень сильно зависят от того, что вам нужно. В общем, откройте старую базу данных И откройте новую пустую базу. Прочитайте старые таблицы, преобразуйте данные, как требуется, и запишите в новую базу данных. Закройте базы данных. Удалить старую БД. Переименуйте новый БД в стандартное имя БД. Откройте новый БД.
Если ничего другого, вывод echo .dump | sqlite my_database.sqlite
разработано, чтобы быть чрезвычайно переносимым, даже к базам данных не SQLite.
Или, если я неправильно читаю ваш вопрос, вы можете изменить таблицу.