2

假设我有一个包含一堆迁移文件的应用程序,我正准备首次将其部署到生产环境中。据我了解,我基本上有两种选择可以在生产服务器上启动数据库:

  • A - 运行db:migrate,并让它循环遍历它尚未运行的所有迁移
  • B - 运行db:schema:load,并让它从模式文件构建数据库

我知道 B 是新部署的正确选择,如schema.rb评论中所述:

# If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).

我想知道的是,这将如何影响生产服务器上的迁移?例如,如果我按顺序执行以下操作:

  1. db:schema:load在新的生产服务器上运行。
  2. 在开发中更改我的架构并推动生产。
  3. db:migrate在生产服务器上运行

会发生什么?它会知道只使用比db:schema:load操作更新的迁移,还是会尝试全部运行它们?

4

1 回答 1

1

好问题。答案是只有在最新db:schema:load事件之后创建的迁移才会运行。

schema.rb文件有一个与之关联的版本标记:

ActiveRecord::Schema.define(version: 20130928225041) do ...

当您运行时db:schema:load,Rails 会根据该 schema.rb 文件创建一个新数据库,同时schema_migrations使用版本号在模式之前的所有迁移填充该表。

所以据我所知,Rails 本质上是在伪造所有迁移,但实际上并没有运行它们。(我通过生成一个空的迁移文件来测试这一点,db:migrate在本地调用,但是在将迁移文件部署到我们的服务器之前,将错误插入到迁移文件中。在服务器上,我们运行了db:schema:load,结果是错误的迁移包含在schema_migrations 表就像它已经运行一样,即使它显然没有运行。)

于 2013-09-28T23:17:13.330 回答