Сбой восстановления 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. Представьте, что пользователь может восстановить резервную копию из более старой версии и "сломать" ваше программное обеспечение. Пользователю должно быть ясно, что база данных более старых версий несовместима с более новой версией.

Я бы порекомендовал вам поискать в интернете помощь в создании "плана миграции". По сути, это означает, что вы отслеживаете "версию" базы данных и последовательно применяете изменения базы данных, когда это необходимо, таким образом, который очень похож на работу патча.

Другие вопросы по тегам