使用 bookmarks_polymorphic 重新构建时出错

您好,

我在重建时遇到一个错误:

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.

如何解决这个 bug?

您可能需要添加您要定位的分支,是 stable 还是 tests-passed

1 个赞

您好,

通常情况下,这是 tests-passed 分支…
我通过手动删除触发器解决了这个问题。但不知道以后会不会有问题。

1 个赞

很好。如果出现问题,您可以随时进入容器并有选择地运行迁移。

不幸的是,在全新安装 3.0.0.beta16 后,psql 中没有可以删除的触发器。
然而,恢复我从 2.9.0.beta12 制作的备份会因同样的错误而失败。

错误:无法删除表 bookmarks 的列 post_id,因为其他对象依赖于它
详细信息:表 bookmarks 上的触发器 bookmarks_polymorphic_data_sync 依赖于表 bookmarks 的列 post_id

编辑:
现在明白了 - 在源文件中删除了触发器 - 更新和恢复备份后又开始工作了 - 感谢提示

@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 migrate 处失败吗?

执行了以下操作,升级成功!

启动容器,因为它在升级过程中已停止

./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

之后,更新脚本应该能够删除该列,一切都会顺利进行——祈祷吧。