【问题标题】:Can't migrate to heroku (Ruby on Rails tutorial [Michael Hartl] chaper 10)无法迁移到 heroku(Ruby on Rails 教程 [Michael Hartl] 第 10 章)
【发布时间】:2017-06-06 18:58:42
【问题描述】:

我正在阅读 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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 heroku


    【解决方案1】:

    在我看来,AddPasswordDigestToUsers 迁移最初看起来像这样(可能你拼错了):

    class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :password_digest_string
      end
    end
    

    然后您意识到该列应该只是password_digest。因此,您手动将迁移文件编辑为现在的样子,回滚,创建下一个迁移 RemoveColumns,然后运行迁移。

    现在,当您从头开始迁移时,由于the way column removal is handled in sqlite,您使用sqlite3(这是您用于开发环境的)不会出错。但是如果你使用 Postgres 会报错。

    你应该做的事

    您应该刚刚创建了一个迁移来更改列名,而不是您所做的,如下所示:

    class RenamePasswordDigestStringColumn < ActiveRecord::Migration[5.0]
      def self.up
        rename_column :users, :password_digest_string, :password_string
      end
    end
    

    你现在可以做什么

    要在不做很多更改的情况下解决问题,您可以删除RemoveColumns 迁移(并提交、推送......等等)。没关系,我认为这不会损害您的生产或开发环境。

    【讨论】:

    • 太棒了。谢谢你。我认为我遇到的问题是我试图在回滚到以前的迁移之前删除 RemoveColumns 迁移。现在在heroku上启动并运行它。感谢您的帮助!
    【解决方案2】:

    $&gt; heroku pg:reset DATABASE 将使 heroku 上的 db:migrate 再次干净

    【讨论】:

    • 无论这是否解决了问题中的错误,重置数据库都会破坏所有数据。这不是人们应该用来解决迁移问题的方法,尤其是在生产环境中!
    • 是的,我试过了,我什至创建了一个新的 Heroku 应用程序并尝试迁移到它。迁移文件是否仅负责决定如何构建表?似乎我的应用程序中的其他内容正在告诉 PG 删除该列,即使它已经消失了。问题仅限于 heroku,在本地 SQLite3 上运行良好。
    • @TamerShlash 你对我有什么建议吗?我想我创建了一个迁移来删除不需要的列,然后回滚了创建该列的迁移。现在我无法让 postgres 停止尝试删除它一开始不知道的列。
    • @C-RAD 是的,我认为是这样。如果您在 github 上有您的应用程序,您可以将链接提供给我们,以便我们查看完整的迁移历史记录。
    • @TamerShlash 听起来不错,它是github.com/crajcan/sample-app。我想如果我能找到创建不需要的列的初始迁移的名称,然后将其添加回来,我应该没问题。我一直在寻找所有的分支来试图找到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    相关资源
    最近更新 更多