17

我在将迁移推送到生产数据库时遇到问题。

问题:

  1. 我通过添加 1 列更改了数据库架构。
  2. 我已将其迁移到生产数据库:

    MacBook-Air-Mac:app msc$ rake db:migrate RAILS_ENV="production" [RailsAdmin] RailsAdmin 初始化默认禁用。如果需要,请传递 SKIP_RAILS_ADMIN_INITIALIZER=false。== AddLengthColumnToBooks: 迁移 ==========================================--add_column( :books, :length, :integer) -> 0.0017s == AddLengthColumnToBooks: 已迁移 (0.0019s) ============================ ====

  3. 考虑到新的数据库模式现在已经投入生产,我已经部署了使用:length.

  4. 在生产中,我收到以下错误:

    未定义的方法 `length=' for #

  5. 我做heroku rollback了并将应用程序降级到最新的可靠版本。

  6. 然后(可能有点太晚了)我发现我必须heroku restart在应用程序中加载新索引。我这样做了好几次。

  7. 然后我打开控制台并检查Book.column_names,但没有length

  8. 我确实heroku run rake db:migrate又跟着了heroku restart一次,没有变化。

  9. 我尝试将另一列迁移到生产数据库,但根本没有收到任何消息,甚至没有来自 p.2 的消息。

我在这里做错了什么?

更新

根据Philipe的回答,我做了一些额外的步骤:

  1. git add db/schema.rb,git add db/migrate/20130325103953_add_length_column_to_books.rb 和 'git add db/migrate/20130401041910_add_duration_column_to_books.rb'。吉特的回答是:
  2. 要提交的更改:(使用“git reset HEAD ...”取消暂存)

    新文件:db/migrate/20130325103953_add_length_column_to_books.rb 新文件:db/migrate/20130401041910_add_duration_column_to_books.rb 修改:db/schema.rb

  3. 然后我做到了git commit -m "Updating the schema"

  4. 同样的输出是:

     3 files changed, 168 insertions(+), 156 deletions(-)
    

    创建模式 100644 db/migrate/20130325103953_add_length_column_to_books.rb 创建模式 100644 db/migrate/20130401041910_add_duration_column_to_books.rb

  5. 然后我跑heroku run rake db:migrate。不幸的是,没有迁移的迹象,只是得到了:

    运行rake db:migrate连接到终端... up, run.5428 就是这样。

  6. 在生产 Rails 控制台中,运行Book.column_names仍然缺乏长度和持续时间。

现在我更没有想法了。`

4

4 回答 4

37

看起来您并没有将更改推送到 Heroku。步骤应如下;

  1. 更改本地代码
  2. 在本地运行任何迁移
  3. 将所有更改的文件添加到 Gitgit add .
  4. 将所有添加的文件提交到 gitgit commit -m "Adding features"
  5. 将更改推送到 Heroku git push heroku master- 假设您使用heroku远程名称并且您正在master分支中工作
  6. 如果您heroku run rake db:migrate运行迁移以在 HEROKU 上运行迁移
  7. 以下迁移heroku restart

这应该是你工作所需要的一切。

于 2013-04-01T12:12:19.243 回答
3

我有同样的问题; 我git添加了迁移,git将它们推送到服务器,cap部署它们,数据库没有改变。直接登录服务器,运行 rake db:migrate,命令行好像运行迁移,但没有任何变化。

就我而言,不知何故 rake db:migrate 使用了错误的 RAILS_ENV。我登录到服务器,然后运行

rake db:migrate RAILS_ENV=production

这导致数据库创建新列,然后我在测试数据库中调试的所有代码都开始在服务器上运行。

于 2014-05-31T23:02:04.777 回答
2

我只是有同样的问题。在本地向我的数据库添加一列后,我做了heroku run rake db:migrate -app [my app name]. 在生产环境中运行我的代码,我得到了ActiveRecord::UnknownAttributeError (unknown attribute '_____' for [table name].)

这解决了我的问题:

heroku restart --app [my app name]

于 2015-11-18T21:15:40.873 回答
0

根据我的经验,我的两分钱:我认为这heroku run db:migrate也将数据库内容迁移到生产中。不!只有结构。因此,就我而言,登录在生产环境中不起作用,因为其中没有用户。我不得不再次注册测试用户,然后它就起作用了。希望对像我这样的新手有帮助

于 2017-04-21T15:36:53.383 回答