bookmarks_polymorphic でリビルド中にエラーが発生

こんにちは。

Rebuildでエラーが発生しています。

> FAILED
> --------------------
> Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 1121 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.1.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap failed with exit code 1

スクロールアップすると、以下のようになります。

> PG::DependentObjectsStillExist: ERROR:  cannot drop column post_id of table bookmarks because other objects depend on it
DETAIL:  trigger bookmarks_polymorphic_data_sync on table bookmarks depends on column post_id of table bookmarks
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

このバグを解決するにはどうすればよいでしょうか?

stable または tests-passed のどちらのブランチを対象としているかを追加するとよいでしょう。

「いいね!」 1

こんにちは。

通常は tests-passed ブランチです。
トリガーを手動で削除することで問題を解決しましたが、後で問題になるかどうかはわかりません。

「いいね!」 1

いいですね。問題になった場合は、コンテナに入ってマイグレーションを選択的に実行することができます。

残念ながら、3.0.0.beta16 のクリーンインストールでは、削除できるような psql のトリガーはありません。
しかし、2.9.0.beta12 から作成したバックアップを復元すると、同じエラーで失敗します。

ERROR: cannot drop column post_id of table bookmarks because other objects depend on it
DETAIL: trigger bookmarks_polymorphic_data_sync on table bookmarks depends on column post_id of table bookmarks

編集:
わかりました。元からトリガーを削除したところ、バックアップの更新と復元が再び機能するようになりました。ヒントをありがとうございます。

@DeviceNull
トリガーをどのように削除できましたか?

Discourseのアップグレード中に同様の問題が発生しています。

Caused by:
PG::DependentObjectsStillExist: ERROR:  cannot drop column post_id of table bookmarks because other objects depend on it
DETAIL:  trigger bookmarks_polymorphic_data_sync on table bookmarks depends on column post_id of table bookmarks
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

同様の問題を経験した方はいらっしゃいますか?アップグレード中にDB移行が失敗した場合です。

以下を実行したところ、アップグレードは成功しました!

アップグレード中に停止していたコンテナを起動します。

./launcher start app
./launcher enter app

psqlコマンドプロンプトに入ります。

sudo -u postgres psql discourse

トリガーを確認します。

SELECT tgname FROM pg_trigger;

トリガーを削除します。

DROP TRIGGER IF EXISTS bookmarks_polymorphic_data_sync ON bookmarks CASCADE;

再構築します。

./launcher rebuild app

「いいね!」 1
  1. ターミナル(bashと仮定します)からコンテナ内でmysqlコンソールを開始します。
    docker exec -i name_of_your_container mysql

mysqlコンソールで以下を実行します。
use discourse;
DROP TRIGGER bookmarks.bookmarks_polymorphic_data;

コンソールを終了するには以下を実行します。
exit

その後、アップデートスクリプトはカラムを削除できるようになり、すべてがスムーズに進むはずです。うまくいきますように。