【问题标题】:Can I manually create migrations for production in Heroku, Ruby on Rails?我可以在 Heroku、Ruby on Rails 中手动创建用于生产的迁移吗?
【发布时间】:2020-10-06 17:46:07
【问题描述】:

我用 Ruby 和 Rails 创建了一个应用程序。问题是,当我开发它时,我在迁移时遇到了一些问题,因为我创建了它们但语法错误。发生的事情是我删除了一些文件,因为出售的无效迁移与新迁移的名称相同,但在这中间我不小心删除了一些迁移(显然是在运行 rails db:migrate 之后)项目实际使用。例如,我有 Service 表,它与 Reservation 表相关,因为 Service 有 reservation_id,但我没有显示 AddReservationIdToService 的迁移文件。

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

我可以手动创建迁移,所以当我为 postgres 运行 db:migrate 时,会创建数据库的完整结构而不缺少关系?

【问题讨论】:

  • 迁移可能很痛苦。我的建议是在添加/删除迁移文件时执行rake db:droprake db:create rake db:migrate,直到你得到你想要的。但是首先在本地环境中使用 sqlite 在本地执行此操作,如果您想将当前的 sqlite 数据库名称更改为另一个,这样您就不会删除旧的数据库。然后,当您能够毫无错误地执行 drop create 和 migrate 时,请在您的 heroku db 中执行此操作。您的 Heroku 数据库中是否已有数据?

标签: ruby-on-rails ruby postgresql heroku database-migration


【解决方案1】:

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

bin/rails db:schema:load

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

bin/rails db:schema:dump

针对 sqlite 版本从数据库中重新创建一个新的架构文件。

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

【讨论】:

  • 非常感谢,这救了我!
【解决方案2】:

是的,您可以创建另外几个迁移文件。 用你的 sqlite 证明你现在在本地拥有你想要的表。在一张纸上画出这些表格(或者在你最好的地方),然后查看这个官方API documentation of Rails

删除之前所做的所有迁移并根据您绘制的表格创建另一个。

工作流程是这样的:

1) “我需要创建一个名为 Reservation 的表,它在文档中的什么位置显示?”

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

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

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

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

heroku run rails db:migrate

请记住不要在本地运行相同的迁移,因为您已经在本地拥有这些表。

最后两个建议是:

1) 如果您的迁移未按预期进行,请不要删除迁移文件。相反,请运行 rails db:rollback 并重试。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多