首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby on Rails ActiveRecord::PendingMigrationError

问Ruby on Rails ActiveRecord::PendingMigrationError
EN

Stack Overflow用户
提问于 2018-01-08 10:11:20
回答 1查看 123关注 0票数 1

当我试图在我的本地主机上加载我的rails应用程序时,我得到了一个错误,告诉我通过运行rails db:migrate来解决这个问题,但是当我尝试运行这个命令时,我得到的是这样的结果

代码语言:javascript
复制
C:\Sites\CoolGuyGear>rails db:migrate

== 20180108004216 AddDeviseToViews: migrating =================================
-- change_table(:views)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: duplicate column name: email: ALTER TABLE "views" ADD "email" varchar DEFAULT '' NOT NULL
C:/Sites/CoolGuyGear/db/migrate/20180108004216_add_devise_to_views.rb:7:in `block in up'
C:/Sites/CoolGuyGear/db/migrate/20180108004216_add_devise_to_views.rb:5:in `up'
bin/rails:4:in `require'
bin/rails:4:in `<main>'

Caused by:
ActiveRecord::StatementInvalid: SQLite3::SQLException: duplicate column name: email: ALTER TABLE "views" ADD "email" varchar DEFAULT '' NOT NULL
C:/Sites/CoolGuyGear/db/migrate/20180108004216_add_devise_to_views.rb:7:in `block in up'
C:/Sites/CoolGuyGear/db/migrate/20180108004216_add_devise_to_views.rb:5:in `up'
bin/rails:4:in `require'
bin/rails:4:in `<main>'

Caused by:
SQLite3::SQLException: duplicate column name: email
C:/Sites/CoolGuyGear/db/migrate/20180108004216_add_devise_to_views.rb:7:in `block in up'
C:/Sites/CoolGuyGear/db/migrate/20180108004216_add_devise_to_views.rb:5:in `up'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

迁移:

代码语言:javascript
复制
# frozen_string_literal: true

class AddDeviseToViews < ActiveRecord::Migration[5.1]
  def self.up
    change_table :views do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at


      # Uncomment below if timestamps were not included in your original model.
      # t.timestamps null: false
    end

    add_index :views, :email,                unique: true
    add_index :views, :reset_password_token, unique: true
    # add_index :views, :confirmation_token,   unique: true
    # add_index :views, :unlock_token,         unique: true
  end

  def self.down
    # By default, we don't want to make any assumption about how to roll  
    #back a migration when your
    # model already existed. Please edit below which fields you would like to remove in this migration.
  raise ActiveRecord::IrreversibleMigration
  end
end


 create_table "views", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer "sign_in_count", default: 0, null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string "current_sign_in_ip"
    t.string "last_sign_in_ip"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["email"], name: "index_views_on_email", unique: true
    t.index ["reset_password_token"], name: 
"index_views_on_reset_password_token", unique: true
 end
EN

回答 1

Stack Overflow用户

发布于 2018-01-08 10:38:23

答案就在问题中。

无论您添加了什么迁移,都会在数据库中创建重复的列,如迁移生成的日志中所示。

duplicate column name: email: ALTER TABLE "views" ADD "email"

创建一个从数据库中删除这些列的迁移,或者直接进入本地mysql/sqlite数据库并手动删除这些列。再次运行迁移,由于数据库表中还没有这些列,因此不会收到这些错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48143433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档