在开发中改变了我的数据库结构,因此尝试重置Heroku部署的数据库.删除它但现在我无法迁移我的数据库

Bri*_*ian 4 deployment ruby-on-rails heroku ruby-on-rails-3

所以我的应用程序工作正常.我创建了一个新模型和一些关联,使我的heroku app中的所有旧种子数据都无用.所以我试图重置它并再次填充它.但是我甚至无法使用heroku rake db:migrate命令将我的数据库迁移到heroku .我正在使用SQLite,但似乎我的错误与Postgres有关.我不知道这意味着什么,如果有的话

这是错误:

rake aborted!
An error has occurred, this and all later migrations canceled:

PGError: ERROR:  column "to" cannot be cast to type "pg_catalog.int4"
: ALTER TABLE "emails" ALTER COLUMN "to" TYPE integer

Tasks: TOP => db:migrate
Run Code Online (Sandbox Code Playgroud)

我的迁移:

class ChangeDataTypeForEmailUsers < ActiveRecord::Migration
  def self.up
      change_column :emails, :to, :integer
      change_column :emails, :from, :integer
  end

  def self.down
      change_column :to, :string
      change_column :from, :string
  end
end
Run Code Online (Sandbox Code Playgroud)

问题是什么?我部署的应用程序工作正常.我添加了一个新模型,并认为我应该重置已部署的数据库.所以我跑了heroku pg:reset然后把我的代码推到了heroku.然后尝试迁移数据库,但它不起作用!我做了什么?在过去的4个小时里,我一直试图解决这个问题.我不能再思考了.任何帮助将不胜感激

Tar*_*ast 8

继Hishalv的回答.如果您不能使用"change_column",那么您可以采用迂回方式:

 def self.up
   rename_column :emails, :to, :old_to
   add_column :emails, :to, :integer
   Email.reset_column_information
   Email.all.each {|e| e.update_attribute(:to, e.old_to.to_i) }
   remove_column :emails, :old_to
 end
Run Code Online (Sandbox Code Playgroud)

这是环形交叉路口,Email.all.each可能会很慢 - 但它会为你工作和正确投射.

如果您只是在prod上使用它,那么您可以使用SQL UPDATE命令替换ruby-updates,该命令使用POSTGRES特定的强制转换方法在数据库中执行相同的操作.