我正在研究Hartl书的第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 relation "users" does not exist
: ALTER TABLE "users" DROP "password_digest_string"
在本教程的前面,我删除了一个名为password_digest_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
..._ add_index_to_users_email.rb
class AddIndexToUsersEmail < ActiveRecord::Migration[5.0]
def change
add_index :users, :email, unique: true
end
end
..._ add_password_digest_to_users.rb
class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :password_digest, :string
end
end
..._ remove_columns.rb
class RemoveColumns < ActiveRecord::Migration[5.0]
def self.up
remove_column :users, :password_digest_string
end
end
..._ add_remember_digest_to_users.rb
class AddRememberDigestToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :remember_digest, :string
end
end
..._ add_admin_to_users.rb
class AddAdminToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :admin, :boolean, default: false
end
end
答案 0 :(得分:0)
在我看来,AddPasswordDigestToUsers
迁移最初看起来像这样(可能是拼错了):
class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :password_digest_string
end
end
然后您意识到该列应该只是password_digest
。因此,您手动将迁移文件编辑为现在的样式,回滚,创建下一次迁移RemoveColumns
,然后运行迁移。
现在,当您从头开始迁移时,如果您使用sqlite3
(这是您用于开发环境的那个),则the way column removal is handled in sqlite将不会出现错误。但是如果你使用Postgres就会出错。
你应该做什么
您应该刚刚创建了一个迁移来更改列名,而不是您所做的,如下所示:
class RenamePasswordDigestStringColumn < ActiveRecord::Migration[5.0]
def self.up
rename_column :users, :password_digest_string, :password_string
end
end
您现在可以做什么
要在不进行多项更改的情况下解决问题,您只需删除RemoveColumns
迁移(并提交,推送等等)。那没关系,我认为它不会对你的生产或开发环境造成伤害。
答案 1 :(得分:-1)
$> heroku pg:reset DATABASE
将使heroku上的db:migrate再次清理