【问题标题】:Rails db migrate aborted error when changing a field name after 1st migrate在第一次迁移后更改字段名称时,Rails db 迁移中止错误
【发布时间】:2017-01-21 19:15:06
【问题描述】:

我偶然命名了 add_column :users, :confirmed_at(confirmation_at), :datetime。所以我把它改成了合适的字段名:(confirmed_at)

然后我在命令行中输入:rake db:rollback。由于某种原因,它被中止了,但首先是我的 Rails db 迁移文件代码:

class AddConfirmableToDevise < ActiveRecord::Migration
  def up
    add_column :users, :confirmation_token, :string
    add_column :users, :confirmed_at, :datetime
    add_column :users, :confirmation_sent_at, :datetime

    add_index :users, :confirmation_token, unique: true
  end

  def down
    remove_column :users, :confirmation_token, :confirmed_at, :confirmation_sent_at
  end
end

迁移后出错:

tzurch:~/workspace (gravitar) $ rake db:migrate:redo

#the error that came up below
_________________________________________________
== 20160902201448 AddFullnameToUser: reverting ================================

-- remove_column(:users, :fullname, :string)

-> 0.0207s

== 20160902201448 AddFullnameToUser: reverted (0.0284s) =======================

== 20160902201448 AddFullnameToUser: migrating ================================

-- add_column(:users, :fullname, :string)

-> 0.0008s

== 20160902201448 AddFullnameToUser: migrated (0.0009s) =======================

== 20160913221959 AddConfirmableToDevise: migrating ===========================

-- add_column(:users, :confirmation_token, :string)

-> 0.0009s

-- add_column(:users, :confirmed_at, :datetime)

-> 0.0005s

-- add_column(:users, :confirmation_sent_at, :datetime)

rake aborted!

StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: duplicate column name: confirmation_sent_at: ALTER TABLE "users" ADD "confirmation_sent_at" datetime:

【问题讨论】:

    标签: ruby-on-rails sqlite database-migration


    【解决方案1】:

    我想你已经在 db 的这个表中有confirmation_sent_at 字段

    【讨论】:

      【解决方案2】:

      这里的问题是你用来删除列的语法是错误的。

      正确的语法是remove_column

      remove_column(table_name, column_name, type = nil, options = {})
      

      更改向下迁移

      class AddConfirmableToDevise < ActiveRecord::Migration
        def up
          add_column :users, :confirmation_token, :string
          add_column :users, :confirmed_at, :datetime
          add_column :users, :confirmation_sent_at, :datetime
      
          add_index :users, :confirmation_token, unique: true
        end
      
        def down
          remove_column :users, :confirmation_token
          remove_column :users, :confirmed_at
          remove_column :users, :confirmation_sent_at
      
          remove_index :users, :confirmation_token
        end
      end
      

      或者完全删除down迁移并将up替换为change,rails会弄清楚如何回滚:

      class AddConfirmableToDevise < ActiveRecord::Migration
        def change
          add_column :users, :confirmation_token, :string
          add_column :users, :confirmed_at, :datetime
          add_column :users, :confirmation_sent_at, :datetime
      
          add_index :users, :confirmation_token, unique: true
        end
      end
      

      【讨论】:

      • 我尝试完全删除 def 然后命令 rake db:migrate:redo 在下面收到相同的错误,因为错误提示,db 中似乎有一些重复的字段。如果是这样,我该如何查找和删除。裸露的我经历了一个粗略的红宝石....:ActiveRecord::StatementInvalid: SQLite3::SQLException: 重复的列名:confirmation_sent_at: ALTER TABLE "users" ADD "confirmation_sent_at" datetime
      • 你需要先rake db:migrate:down VERSION=migration_version_no迁移,然后再rake db:migrate:up VERSION=migration_version_no
      • 非常感谢我能够恢复,然后使用适当的字段名称迁移
      猜你喜欢
      • 2013-09-28
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多