Разработать грабли DB: мигрировать не удается из-за дублирования столбца в моей таблице пользователя - Rails 3.1 - PullRequest
7 голосов
/ 17 сентября 2011

Это ошибка, которую я получаю, когда я впервые устанавливаю 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
#

Ответы [ 4 ]

17 голосов
/ 20 октября 2012

В файле миграции, сгенерированном Devise, измените строку

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

для

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

Таким образом, вместо того, чтобы пытаться создать новый почтовый столб, миграция меняет существующий на спецификации Devise.

4 голосов
/ 17 сентября 2011

Попробуйте rake db:rollback, а затем повторите попытку. Когда вы сделали это в первый раз, он добавил столбец id. и почему вы добавляете id :integer not null, primary key это автоматически в рельсах. Это должно выглядеть так:

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

3 голосов
/ 01 февраля 2015

Устранить эту ошибку просто

  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 и ваш ход.:)
2 голосов
/ 12 декабря 2011

Я ударил то же самое, добавив устройство в существующую БД.Это исправило это для меня:

Изменить автоматически сгенерированную миграцию устройства:

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
...