【问题标题】:Devise rake db:migrate fails because of duplicate column in my User's table - Rails 3.1设计 rake db:migrate 由于我的用户表中的重复列而失败 - Rails 3.1
【发布时间】:2011-09-17 10:08:49
【问题描述】:

这是我第一次安装 Devise 并运行 rake db:migrate 时遇到的错误:

==  AddDeviseToUsers: migrating ===============================================
-- change_table(:users)
rake aborted!
An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: duplicate column name: email: ALTER TABLE "users" ADD "email" varchar(255) DEFAULT '' NOT NULL

鉴于这只是测试数据,我可以在我的数据库中删除该列并重新运行它,但这似乎不是很 Railsy - 如果只是因为它将使我的登台服务器(唯一我的应用程序的其他服务器)与我的localhost 不同步。

另外,如果与另一列发生冲突怎么办。

鉴于这是运行迁移之前我的User 表的架构,我应该如何处理?进行某种重命名的迁移?

# == Schema Information
#
# Table name: users
#
#  id         :integer         not null, primary key
#  email      :string(255)
#  f_name     :string(255)
#  l_name     :string(255)
#  username   :string(255)
#  role_id    :integer
#  picture    :string(255)
#  about_me   :string(255)
#  website    :string(255)
#  created_at :datetime
#  updated_at :datetime
#

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 devise ruby-on-rails-3.1


    【解决方案1】:

    在Devise生成的迁移文件中,改行

      t.string :email,              :null => false, :default => ""
    

      t.change :email, :string,     :null => false, :default => ""
    

    因此,迁移不是尝试创建新的电子邮件列,而是将现有的列更改为 Devise 的规范。

    【讨论】:

      【解决方案2】:

      尝试rake db:rollback,然后重试。当你第一次这样做时,它添加了 id 列。以及为什么要添加id :integer not null, primary key 它在rails 中是自动的。它应该是这样的:

      class CreateProducts < ActiveRecord::Migration
        def up
          create_table :products do |t|
            t.string :email
            t.text :f_name
      
            t.timestamps
          end
        end
      
        def down
          drop_table :products
        end
      end
      

      你可以在这里http://guides.rubyonrails.org/migrations.html获取更多信息

      【讨论】:

      • 在我运行 db:migrate 之前,我的 User 模型具有该架构。我什至将一些用户与现有信息一起存储在表中。但是,现在我正在尝试将 Devise 安装到现有的用户模型中,我收到了这个错误。所以是的,我知道存在 :email 列。我只是希望它要么忽略它,要么按照需要修改的方式修改它。
      • 您可以跳过它,但在您的迁移中评论我们的行。然后,您再次运行 rake db:migrate。
      • 是的,这里有同样的问题,我所做的只是注释掉在设计迁移中创建电子邮件表的行,例如 #t.string :email, :null => false, :default => " "
      【解决方案3】:

      解决这个错误很简单

      1. 如果你已经运行“rake db:migrate”我建议运行rake db:rollback
      2. 转到“timestamp_add_devise_to_whatever.rb 并注释掉
      3. # t.string :email, null: false, default: ""
      4. 接下来也对此发表评论
      5. # add_index :users, :email, unique: true
      6. 运行rake db:migrate,一切顺利。 :)

      【讨论】:

      • 你太棒了-效果很好-stackoverflow总是有最差的答案作为选定的答案-这是社会的一个错误!
      【解决方案4】:

      我在现有数据库中添加设计时遇到了同样的问题。这为我解决了问题:

      修改自动生成的设备迁移:

      t.rename :email, :email_old   # move my old email field out of the way 
      ... 
      #add_index :users, :email, :unique => true  ## comment out unique index
      

      迁移数据库。

      使用 SQL 调用以交互方式使(新)电子邮件字段数据条目唯一:

      update users set email=id;
      

      创建另一个添加唯一约束的迁移,然后运行它:

      class UniquifyIndex < ActiveRecord::Migration
        def change
              add_index :users, :email, :unique => true
        end
      

      【讨论】:

        猜你喜欢
        • 2014-01-09
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 2015-01-27
        • 2012-11-26
        • 2016-11-19
        • 1970-01-01
        相关资源
        最近更新 更多