Ruby 在 Rails 上,我可以在 Heroku 中手动创建用于生产的迁移吗?

Can I manually create migrations for production in Heroku, Ruby on Rails?

我已经使用 Ruby 和 Rails 创建了一个应用程序。问题是,当我开发它时,我在迁移方面遇到了一些问题,因为我创建了它们但语法错误。发生的事情是我删除了一些文件,因为售出的迁移不起作用,与新的迁移同名,但在中间我不小心删除了一些迁移(显然在 运行ning rails db:migrate) 项目实际使用的。因此,例如,我有服务 table,它与预订 table 相关,因为服务有 reservation_id,但我没有显示 AddReservationIdToService 的迁移文件。

所以现在我想使用 Heroku 进行生产。问题是 O 必须更改为 postgresql,因为 Heroku 不支持 sqlite。所以我必须再次 运行 de:migrate 以在新数据库中创建 table 和关系,但我需要我解释过但已删除的文件。问题是:

我可以手动创建迁移吗,所以当我 运行 db:migrate 对于 postgres 时,数据库的完整结构是在不缺少关系的情况下创建的?

是的,您可以再创建几个迁移文件。 使用 sqlite 证明您现在在本地拥有您希望的 tables。将这些 table 画在一张纸上(或您认为最好的地方),然后查看官方 API documentation of Rails.

删除之前做的所有迁移,根据你画的table再创建一个。

工作流程如下:

1) "I need to create a table called Reservation, where is it shown on the documentation?"

2)“我需要一个名为 Service 的 table,它在文档中的什么位置显示?

3) “我需要向名为 reservaton_id 的服务添加一个带有外键的列,该文档是怎么说的?

对于上述所有步骤,请像往常一样创建对应的迁移文件。

此处的主要区别在于不运行 本地迁移。相反,将您的新版本应用程序推送到您的 heroku 远程分支,然后 在那里 您 运行 迁移,例如:

heroku run rails db:migrate

切记不要 运行 在本地进行相同的迁移,因为您在本地已经有这些 table。

最后两条建议是:

1) 如果您的迁移没有按预期进行,请不要删除迁移文件。相反,运行 rails db:rollback 再试一次。

2) 在版本控制的同一分支上继续跟踪迁移文件。

您并不真的需要迁移来重新创建现有的数据库——事实上,由于几个原因(包括您遇到的迁移文件丢失问题),尝试这样做并不是一个好主意。你可以简单地 运行:

bin/rails db:schema:load

从现有架构填充新数据库。如果由于某种原因你没有在版本控制下检查 db/schema.rb 你可以 运行:

bin/rails db:schema:dump

针对 sqlite 版本从数据库重新创建一个新的模式文件。

您还可以通过偶尔切换真正的旧迁移来保持迁移列表整洁,因为所有累积更改都在架构文件中捕获。