首先,感谢开发者们创建了如此出色的应用程序!
我希望能够澄清一个令我困惑的问题。我原本以为在 Rails 6 中,正确初始化数据库的方式是使用 $ rake db:prepare 命令,但如果我单独执行 $ rake db:prepare,Discourse 无法正确初始化。从 Meta 或这里的讨论中我看到,prepare 似乎仅用于初始化测试数据,或者可能在某些后台任务中使用。
能否有人帮我理解一下,$ rake db:migrate 是否是初始化 Discourse 数据库以进行迁移或初始化的唯一必要命令?如果是,原因是什么?
michaeld
(Michael - Communiteq)
2
我想你需要先执行 db:create,然后再进行迁移。
pfaffman
(Jay Pfaffman)
3
正如 Michael 所说,数据库必须存在。我通常会执行以下命令:
rake db:drop db:create db:migrate
来重置为一个全新的数据库(当我忘记保存全新安装的备份时)。
我认为构建过程默认会执行 db:create,因为除非我遗漏了实例中的某些功能,否则该实例似乎仅通过资源预编译(或类似操作)和迁移即可正常运行。
经过一番查找,我发现以下信息更接近我寻找的答案:
Discourse 的 rake 任务覆盖了 Rails 的 db:migrate。我认为这在 Rails 应用中属于非标准做法,例如这个 PR:https://github.com/rails/rails/pull/35768。查看 db:prepare 的功能,它直接访问 ActiveRecord 并执行预期的数据库设置,但由于它覆盖了上游中本应独立存在的部分,因此并未调用人们可能预期的其他必要的 db:* 任务。
另附一点说明:我目前设置 Discourse 的方式不允许 Discourse 数据库用户获得提升的权限,因此构建后执行类似 db:drop 和 db:create 的操作似乎需要对已实施的配置进行微调。