Ruby on rails Can';t迁移到heroku(Ruby on Rails教程[Michael Hartl]第10章)
我正在阅读哈特尔书的第10章。在本章的结论中,我们重置了heroku数据库,然后进行迁移。然而,当我跑步时:Ruby on rails Can';t迁移到heroku(Ruby on Rails教程[Michael Hartl]第10章),ruby-on-rails,ruby,ruby-on-rails-3,heroku,Ruby On Rails,Ruby,Ruby On Rails 3,Heroku,我正在阅读哈特尔书的第10章。在本章的结论中,我们重置了heroku数据库,然后进行迁移。然而,当我跑步时: heroku run rails db:migrate 我得到一个错误: rails aborted! StandardError: An error has occurred, this and all later migrations canceled: PG::UndefinedColumn: ERROR: column "password_digest_string" of
heroku run rails db:migrate
我得到一个错误:
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::UndefinedColumn: ERROR: column "password_digest_string" of relation "users" does not exist
: ALTER TABLE "users" DROP "password_digest_string"
在本教程的前面,我删除了一个名为password\u digest\u string的列,因为它的名称不正确,我还不需要它。看起来rails正试图再次删除该列,尽管它已经不存在了。我删除了删除此列的迁移文件,但它仍在尝试删除它。另一个奇怪的是,自从删除该列以来,我已经迁移了数据库好几次,直到我重置了它,才发现这个问题。有什么建议吗
编辑:
这是我的模式文件:
ActiveRecord::Schema.define(version: 20170121224748) do
create_table "users", force: :cascade do |t|
t.string "name"
t.string "email"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "password_digest"
t.string "remember_digest"
t.boolean "admin", default: false
t.index ["email"], name: "index_users_on_email", unique: true
end
end
编辑:
我的迁移是按时间戳顺序进行的
…_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps
end
end
end
class CreateUsers
…\u添加\u索引\u到\u用户\u email.rb
class AddIndexToUsersEmail < ActiveRecord::Migration[5.0]
def change
add_index :users, :email, unique: true
end
end
class AddIndexToUsersEmail
…\u将\u密码\u摘要\u添加到\u users.rb
class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :password_digest, :string
end
end
class AddRememberDigestToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :remember_digest, :string
end
end
class AddAdminToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :admin, :boolean, default: false
end
end
类addPasswordDigestUsers class RemoveColumns < ActiveRecord::Migration[5.0]
def self.up
remove_column :users, :password_digest_string
end
end
class RemoveColumns
…\u将\u记住\u摘要\u添加到\u users.rb
class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :password_digest, :string
end
end
class AddRememberDigestToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :remember_digest, :string
end
end
class AddAdminToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :admin, :boolean, default: false
end
end
class AddMemberDigestUsers
…\u将\u admin\u添加到\u users.rb
class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :password_digest, :string
end
end
class AddRememberDigestToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :remember_digest, :string
end
end
class AddAdminToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :admin, :boolean, default: false
end
end
类AddAdminToUsers$>heroku pg:reset DATABASE
将使heroku上的db:migrate再次干净在我看来,AddPasswordDigestUsers
迁移最初看起来是这样的(可能是拼写错误):
您现在可以做什么
要克服这个问题,现在不做很多更改,只需删除
RemoveColumns
迁移(以及提交、推送…等等)。那没关系,我认为这不会损害您的生产或开发环境。无论这是否解决了问题中的错误,重置数据库都会破坏所有数据。这不是人们应该用来解决迁移问题的方法,尤其是在生产中!是的,我试过了,我甚至创建了一个新的heroku应用程序并尝试迁移到它。迁移文件是否仅负责决定如何构建表?我的应用程序中似乎有其他东西在告诉PG删除该列,尽管它已经不存在了。这个问题只限于heroku,在本地SQLite3上运行良好。@TamerShlash您有什么建议吗?我想我创建了一个迁移来删除不需要的列,然后回滚了创建该列的迁移。现在我无法让postgres停止尝试删除它一开始不知道的列。@C-RAD是的,我想是这样的。如果你在github上有你的应用程序,你可以给我们链接,这样我们就可以看到完整的迁移历史。@TamerShlash听起来不错,很好。我想如果我能找到创建不需要的列的初始迁移的名称,然后再将其添加回去,我应该可以。我把所有的树枝都翻了一遍,想找到它。太棒了。非常感谢。我认为我遇到的问题是,在回滚到以前的迁移之前,我试图删除RemoveColumns迁移。现在就在heroku上运行。谢谢你的帮助!