# \`$rake db:\*\` 命令和初始化 Discourse 实例

**URL:** https://meta.discourse.org/t/the-rake-db-commands-and-initializing-a-discourse-instance/198938
**Category:** Self-hosting
**Tags:** hosting
**Created:** [2021年八月2日 19:44 UTC](https://meta.discourse.org/t/the-rake-db-commands-and-initializing-a-discourse-instance/198938 "2021-08-02T19:44:15Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![jontrossbach](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jontrossbach/32/215843_2.png) [@jontrossbach](https://meta.discourse.org/u/jontrossbach)
#### Post date: [2021年八月2日 19:44 UTC](https://meta.discourse.org/t/the-rake-db-commands-and-initializing-a-discourse-instance/198938/1 "2021-08-02T19:44:15Z")

</div>

首先，感谢开发者们创建了如此出色的应用程序！

我希望能够澄清一个令我困惑的问题。我原本以为在 Rails 6 中，正确初始化数据库的方式是使用 `$ rake db:prepare` 命令，但如果我单独执行 `$ rake db:prepare`，Discourse 无法正确初始化。从 Meta 或这里的讨论中我看到，`prepare` 似乎仅用于初始化测试数据，或者可能在某些后台任务中使用。

能否有人帮我理解一下，`$ rake db:migrate` 是否是初始化 Discourse 数据库以进行迁移或初始化的唯一必要命令？如果是，原因是什么？

---

<div class="post-metadata">

### Author: ![michaeld](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/michaeld/32/1594_2.png) [@michaeld](https://meta.discourse.org/u/michaeld)
#### Post date: [2021年八月2日 21:14 UTC](https://meta.discourse.org/t/the-rake-db-commands-and-initializing-a-discourse-instance/198938/2 "2021-08-02T21:14:17Z")

</div>

我想你需要先执行 `db:create`，然后再进行迁移。

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2021年八月2日 22:07 UTC](https://meta.discourse.org/t/the-rake-db-commands-and-initializing-a-discourse-instance/198938/3 "2021-08-02T22:07:28Z")

</div>

正如 Michael 所说，数据库必须存在。我通常会执行以下命令：

```plaintext
rake db:drop db:create db:migrate

```

来重置为一个全新的数据库（当我忘记保存全新安装的备份时）。

---

<div class="post-metadata">

### Author: ![jontrossbach](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jontrossbach/32/215843_2.png) [@jontrossbach](https://meta.discourse.org/u/jontrossbach)
#### Post date: [2021年八月3日 00:54 UTC](https://meta.discourse.org/t/the-rake-db-commands-and-initializing-a-discourse-instance/198938/4 "2021-08-03T00:54:59Z")

</div>

我认为构建过程默认会执行 db:create，因为除非我遗漏了实例中的某些功能，否则该实例似乎仅通过资源预编译（或类似操作）和迁移即可正常运行。

---

<div class="post-metadata">

### Author: ![jontrossbach](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jontrossbach/32/215843_2.png) [@jontrossbach](https://meta.discourse.org/u/jontrossbach)
#### Post date: [2021年八月4日 14:28 UTC](https://meta.discourse.org/t/the-rake-db-commands-and-initializing-a-discourse-instance/198938/5 "2021-08-04T14:28:31Z")

</div>

经过一番查找，我发现以下信息更接近我寻找的答案：

Discourse 的 rake 任务覆盖了 Rails 的 db:migrate。我认为这在 Rails 应用中属于非标准做法，例如这个 PR：[https://github.com/rails/rails/pull/35768。查看](https://github.com/rails/rails/pull/35768%E3%80%82%E6%9F%A5%E7%9C%8B) db:prepare 的功能，它直接访问 ActiveRecord 并执行预期的数据库设置，但由于它覆盖了上游中本应独立存在的部分，因此并未调用人们可能预期的其他必要的 db:\* 任务。

另附一点说明：我目前设置 Discourse 的方式不允许 Discourse 数据库用户获得提升的权限，因此构建后执行类似 `db:drop` 和 `db:create` 的操作似乎需要对已实施的配置进行微调。
