我有一个包含帖子,用户,标签等的应用。我一直在本地工作,因为一个问题而无法将它推送到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。如果是这样,那么我应该反映我对尚未运行的迁移文件所做的任何更改。然而我收到了这个错误。
答案 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