Rails编辑迁移以忽略错误

时间:2014-12-16 11:37:20

标签: ruby-on-rails ruby heroku

我有一个包含帖子,用户,标签等的应用。我一直在本地工作,因为一个问题而无法将它推送到heroku。最后,我成功地将我的应用程序推送到了heroku,然后意识到我从未在那里迁移过我的数据库。所以我跑了

heroku run rake db:migrate

并收到此错误:

== 20141116151429 CreatePosts: migrating ======================================
-- drop_table(:posts)
PG::UndefinedTable: ERROR:  table "posts" does not exist
: DROP TABLE "posts"
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedTable: ERROR:  table "posts" does not exist

我查了一下迁移,由于某种原因,它在其他任何地方之前都有了drop table:

class CreatePosts < ActiveRecord::Migration
  def change
    drop_table :posts
    create_table :posts do |t|
      t.string :title,              null: false, default: ""
      t.text :description, null: false, default: ""

      t.timestamps
    end
  end
end

我注释了drop table行,甚至删除了它然后使用git commit提交它,然后尝试运行heroku rake db:migrate,但错误仍然显示。我知道这是一个严重的问题,但我不知道该怎么做。

我没有尝试重置数据库,因为担心会出现什么问题,尽管从技术上讲,我可以丢失帖子/用户/评论,这是我迄今为止创建的。

有没有办法可以解决这个问题并仍然将我的所有数据库数据推送到heroku?如果没有,我该怎么办才能让应用程序首先运行?

编辑:

我甚至将迁移改为:

class CreatePosts < ActiveRecord::Migration
  def up
    create_table :posts do |t|
      t.string :title,              null: false, default: ""
      t.text :description, null: false, default: ""

      t.timestamps
    end
  end

  def down
    drop_table :posts
  end
end

但错误仍然显示。我不明白:我知道我编辑了正确的文件(20141116151429_create_posts.rb),我删除了该行。甚至更改了它的全部内容并提交了这些更改,但运行heroku rake db:migrate仍然会出现drop_tables错误。

据我了解,不是heroku rake db:迁移几乎和rake db:migrate一样吗?如果是这样,那么它应该运行待处理的迁移。在这种情况下,所有这些都是,因为我从未迁移到heroku。如果是这样,那么我应该反映我对尚未运行的迁移文件所做的任何更改。然而我收到了这个错误。

3 个答案:

答案 0 :(得分:0)

当您注释掉drop_table语法时,它应该有效。但如果它不起作用,那么尝试使用下面的语法。

仅当数据库中存在表时,它才会运行drop_table

class CreatePosts < ActiveRecord::Migration
  def change
    drop_table 'posts' if ActiveRecord::Base.connection.table_exists? 'posts'
    create_table :posts do |t|
      t.string :title,              null: false, default: ""
      t.text :description, null: false, default: ""

      t.timestamps
    end
  end
end

答案 1 :(得分:0)

这很令人尴尬。

感谢@Dipak和@RubyOnRails的快速回复。

似乎我的提交在第一次提交后完全忽略了迁移文件。我还原了,并通过添加的更改进行了干净的提交,它使迁移没有任何问题。

也许是在第一个没有通过后我对heroku的承诺。

尴尬。

答案 2 :(得分:0)

如果你使用&#39;更改&#39;,drop line就没用了

 # == Reversible Migrations
  #
  # Starting with Rails 3.1, you will be able to define reversible migrations.
  # Reversible migrations are migrations that know how to go +down+ for you.
  # You simply supply the +up+ logic, and the Migration system will figure out
  # how to execute the down commands for you.
  #
  # To define a reversible migration, define the +change+ method in your
  # migration like this:
  #
  #   class TenderloveMigration < ActiveRecord::Migration
  #     def change
  #       create_table(:horses) do |t|
  #         t.column :content, :text
  #         t.column :remind_at, :datetime
  #       end
  #     end
  #   end
  #
   class CreatePosts < ActiveRecord::Migration
      def change
        create_table :posts do |t|
          t.string :title,              null: false, default: ""
          t.text :description, null: false, default: ""

          t.timestamps
        end
      end
    end