Сбой восстановления Debian из сценария postinst
Я немного застрял в файле postinst для Ubuntu. Проблема заключается в обновлении пакета. У меня есть несколько баз данных sqlite (помеченных как файлы конфигурации, чтобы сохранить их от обновлений), в которых я хочу изменить в конкретной версии (добавить несколько столбцов). Как только я хочу изменить базу данных при установке конкретной версии (например, от версии 3 или более ранней до 4), я проверяю, не равен ли $2 нулю.
Подход к обновлению базы данных заключается в следующем:
- сначала я делаю резервную копию баз данных
- сделать новый стол
- Затем я изменяю таблицы
- скопировать строки из старой таблицы в новую
Проблема в том, что если что-то пойдет не так, база данных уже будет изменена, но пакет будет в новой версии (четыре) с версией конфигурации на 3. Если я хочу попробовать установить пакет заново, чтобы получить пакет нормально, postinst потерпит неудачу, потому что база данных уже была изменена. Одна вещь, которая пришла мне в голову, была нерешенной, но я нахожу это очень неприятным.
Я искал в документации о том, как вернуть сбой из postinst, например, если он вызван другим скриптом с другими аргументами, но в документации Debian не говорит ничего полезного. Может быть, скрипт postinst - не лучшее место для изменения баз данных?
Спасибо
С наилучшими пожеланиями
1 ответ
Одна вещь, которую вы можете сделать, это проверить, существует ли поле в таблице, и изменить в этом случае. Это не зависит от того, является ли это обновление или нет.
Вот так например:
if sqlite3 /collection.db '.schema media' | grep -q 'new_field text' ; then
echo field already exists, continuing
else
sqlite3 /collection.db 'alter table media add column new_field text'
fi
Кроме того, я бы рекомендовал приложению манипулировать схемой базы данных, а не dpkg. Представьте, что пользователь может восстановить резервную копию из более старой версии и "сломать" ваше программное обеспечение. Пользователю должно быть ясно, что база данных более старых версий несовместима с более новой версией.
Я бы порекомендовал вам поискать в интернете помощь в создании "плана миграции". По сути, это означает, что вы отслеживаете "версию" базы данных и последовательно применяете изменения базы данных, когда это необходимо, таким образом, который очень похож на работу патча.