Обобщено из Latest update won't build due to various reasons, так как в этой теме в настоящее время обсуждаются три разные проблемы.
Проблема:
При попытке обновить Discourse с установленным плагином AI обновление завершается ошибкой:
PG::UndefinedColumn: ERROR: column llm_models.url does not exist
LINE 1: SELECT "llm_models".* FROM "llm_models" WHERE "llm_models"
и делает Discourse неработоспособным до тех пор, пока плагин AI не будет удален.
Когда это происходит:
При обновлении экземпляра с плагином AI
С версии, в которой еще нет миграции 20240514171609
До коммита 8d5f901 или более новой версии
(Мой главный вопрос заключался в том, почему это происходит только при обновлении уже установленного плагина, а не при новой установке плагина. Ответ: ядро перехватывает исключения PG::UndefinedTable, но не PG::UndefinedColumn. Если плагин уже установлен, возникает второе исключение; если плагин совершенно новый — первое).
Причина:
В файле plugin.rb вызывается LlmModel.enable_or_disable_srv_llm!, который зависит от наличия столбца llm_models.url. Однако, если миграция 20240514171609 (которая добавляет этот столбец) еще не применена, происходит сбой.
Проблема в том, что db:migrate также выполняет этот код, что приводит к сбою задачи rake до того, как миграция сможет быть применена.
Предлагаемые обходные пути / исправления:
- Изменить код на
LlmModel.enable_or_disable_srv_llm! if Discourse.running_in_rack?(чтобыdb:migrateне вызывал эту функцию)
или - Изменить код на
LlmModel.enable_or_disable_srv_llm! rescue nil(чтобы не происходил сбой)
или - Изменить код инициализации в ядре, чтобы перехватывать
PG::UndefinedColumnв дополнение кPG::UndefinedTable(чтобы перехватывались и это, и подобные проблемы в будущем)