2016-07-04 8 views
1

Nach dem Upgrade in Konflikt 5,0 von 4,2 auf Rails ich folgende Störung erhalte:Ruby on Rails 5.0 Upgrade mit Migration von Benutzern Tabelle

rails db:migrate 
== 20160703164716 AddDeviseToUsers: migrating ================================= 
-- change_table(:users) 
rails aborted! 
StandardError: An error has occurred, this and all later migrations canceled: 

PG::DuplicateColumn: ERROR: column "email" of relation "users" already exists 
: ALTER TABLE "users" ADD "email" character varying DEFAULT '' NOT NULL 
/Users/my_username/.rvm/gems/ruby-2.3.0/gems/activerecord-5.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `async_exec' 
/Users/my_username/.rvm/gems/ruby-2.3.0/gems/activerecord-5.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `block in execute' 

Nach dem Lesen der beiden folgenden Stack-Überlauf-Beiträge:

PGError: ERROR: column “email” of relation “users” already exists

Devise migration on existing model

Meine Frage ist, welche der beste Weg ist, um den Datenbankkonflikt zu lösen, der mit der Registerkarte Benutzer auftritt le?

Ist es am besten, eine vorhandene Migrationsdatei wie die Migration AddDeviseToUsers 20160703164716 zu bearbeiten oder ist es ratsam, eine neue Migration durchzuführen?

Was ist der Befehl zum Erstellen einer neuen Migration und der beste Name für diese Migration, der Datenbankkonflikte in meiner Entwicklungs- und Heroku-basierten Produktionsumgebung verhindert?

def self.up 
    change_table(:users) do |t| 
    t.recoverable 
    t.trackable 
    # rememberable uses remember_token, but this field is different 
    t.rename :remember_token_expires_at, :remember_created_at 
    # these fields are named differently in devise 
    t.rename :crypted_password, :encrypted_password 
    end 
end 

Oben ist der vorgeschlagene Code aus dem zweiten Beitrag vorgeschlagen.

Wie würden Sie diesen Code nehmen und eine neue Migration daraus machen?

Nach Migrationen Erforschung Ich habe die folgende Migration gemacht:

rails g migration change_data_type_for_users 

eine neue Migration generieren, die ich nach bearbeitet, was ich den Fehler oben verstehen in den Benutzer Felder beheben werden hindeutet. Der neue Migrationscode:

class ChangeDataTypeForUsers < ActiveRecord::Migration[5.0] 
    def change 
    change_table(:users) do |t| 
     t.string :email,    :null => false, :default => "" 
    end 
end 

Nach dem Ausführen von Rails db: migrate ich den gleichen Fehler erhalten. Was mache ich falsch? Soll ich jetzt die neue Migration zurücksetzen oder bearbeiten?

Ich habe diesen Stack Overflow Artikel gefunden. (Rails 4 Ruby 2.00 Devise migration on existing User Model fails) Ist dies der richtige Weg zu nehmen? Wird beim Löschen der Datenbank alle Datenbankdaten gelöscht?

Ein anderer Fund hier führt zu der Annahme, wenn die Ausführung von Rake db: reset die Daten in meiner Datenbank zerstört. Macht dies die Datenbank neu erstellen? Es ist nicht klar und aus dem folgenden Beitrag scheint es, als wäre es sehr schädlich, wenn alle Daten zerstört werden. Wir wollen nur ein Feld in einer Tabelle fixieren.

(Difference between rake db:migrate db:reset and db:schema:load)

ich wirklich versuche, meine eigene Frage zu beantworten, so vielleicht dieses Modell macht einen Unterschied, dass zusätzlich zu dem Benutzermodell, das von ActiveAdmin erstellt worden zu sein scheint:

class AdminUser < ApplicationRecord 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, 
     :recoverable, :rememberable, :trackable, :validatable 
end 
+0

Wie Sie aus der Fehlermeldung zu sehen, das „Problem“ ist dass Sie eine E-Mail-Spalte hinzufügen, obwohl sie bereits in Ihrer Benutzertabelle vorhanden ist. Die Migration ist in Ordnung, es scheint, dass das Problem in der Desynchronisierung der Datenbankversion (die tatsächlich bereits die E-Mail-Spalte enthält) und der Migrationen liegt. Versuchen Sie, die Datenbank zurückzusetzen (falls Sie keine vertraulichen Daten haben). –

+0

Paul, vielen Dank. Das bedauerliche ist, dass ich sensible Daten habe und das ist die Angst oder das Zurücksetzen der db. Gibt es eine Möglichkeit, zu dieser Spalte zurückzukehren und sie mit der Befehlszeile zu entfernen? Ich habe eine Menge Links gefunden, um die db zurückzusetzen (http://stackoverflow.com/questions/10301794/difference-between-rake-dbmigrate-dbreset-and-dbschemaload), bin aber besorgt über die Daten in anderen Teilen der db das sind empfindlich. – March

+0

Sie können Spalte entfernen, ja. Führen Sie 'rails db' aus, und Sie erhalten dann Ihre db-Konsole. Lesen Sie für die Syntax Ihrer Datenbank-Engine, um die Tabelle zu ändern und die Spalte zu löschen (es sei denn, sie ist sqllite) –

Antwort

1

Denken Sie in Ihrem Fall daran, dass Sie versuchen, eine Spalte zu ändern, die in Ihrer Datenbank vorhanden ist, so wie Sie dies tun, als würden Sie eine neue erstellen.

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

können Sie diese Zeile ändern, um

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

innerhalb des Blocks, zu wissen, dass „t“ Tabelle Benutzer

ist
+0

Dies funktionierte danke @ Paul Bulanov und @xploshioOn! – March