Frage

ich falsch eine Spalte hased_password statt hashed_password genannt.

Wie aktualisiere ich das Datenbankschema, Migration mit dieser Spalte umbenennen?

War es hilfreich?

Lösung

rename_column :table, :old_column, :new_column

Update:

Sie werden wahrscheinlich eine separate Migration erstellen möchten, dies zu tun. (Rename FixColumnName wie man so will)

script/generate migration FixColumnName
# creates  db/migrate/xxxxxxxxxx_fix_column_name.rb

Dann bearbeitet die Migration deinen Willen zu tun.

# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migration
  def self.up
    rename_column :table_name, :old_column, :new_column
  end

  def self.down
    # rename back if you need or do something else or do nothing
  end
end

Ein Update für Rails 3.1

Während der up und down Methoden gelten nach wie vor. Rails 3.1 erhält eine change Methode, dass "weiß, wie Ihre Datenbank zu migrieren und es umgekehrt, wenn die Migration zurück, ohne die gewalzt Notwendigkeit, eine separate down-Methode "

schreiben
rails g migration FixColumnName

class FixColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

Wenn Sie zufällig eine ganze Reihe von Spalten haben, umbenannt, oder etwas, das den Namen der Tabelle erforderlich wäre zu wiederholen immer und immer wieder.

rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...

Sie change_table verwenden könnten die Dinge ein wenig sauberer zu halten.

class FixColumnNames < ActiveRecord::Migration
  def change
    change_table :table_name do |t|
      t.rename :old_column1, :new_column1
      t.rename :old_column2, :new_column2
      ...
    end
  end
end

Danke, Luke && Turadg, für das Thema Erziehung.

Dann einfach db:migrate wie gewohnt oder aber Sie gehen über Ihr Geschäft.


Ein Update für Rails 4

Während ein Migration wie zum Umbenennen eine Säule zu schaffen, Schienen 4 erzeugen ein change Verfahren anstelle von up down und wie in der oben erwähnten Antwort. Die erzeugte change Methode ist wie folgt:

$ > rails g migration ChangeColumnName

, die eine Migrationsdatei ähnlich wie dies schaffen werden:

class ChangeColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

Andere Tipps

IMO, in diesem Fall eine bessere Nutzung rake db:rollback. Dann Migration bearbeiten und wieder rake db:migrate eingeben. Wenn Sie Daten in der Spalte haben jedoch wollen Sie nicht verlieren, dann rename_column verwenden.

Wenn die Spalt bereits mit Daten und Live-Produktion bestückt ist, würde ich einen Schritt für Schritt-Ansatz empfehlen, um zu vermeiden, Ausfallzeiten in der Produktion, während für die Migration zu warten.

Zuerst würde ich eine db Migration erstellen Spalten mit dem neuen Namen (n) hinzufügen und sie mit den Werten aus dem alten Spaltennamen füllen.

class AddCorrectColumnNames < ActiveRecord::Migration
  def up
    add_column :table, :correct_name_column_one, :string
    add_column :table, :correct_name_column_two, :string

    puts 'Updating correctly named columns'
    execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two"
    end
  end

  def down
    remove_column :table, :correct_name_column_one
    remove_column :table, :correct_name_column_two
  end
end

Dann würde ich begehen nur, dass zu ändern, und drücken Sie die Änderung in der Produktion.

git commit -m 'adding columns with correct name'

Dann, wenn der Commit wurde in der Produktion geschoben, würde ich laufen.

Production $ bundle exec rake db:migrate

Dann würde ich alle Ansichten / Controller aktualisieren, die den alten Spaltennamen an den neuen Spaltennamen verwiesen wird. Führen Sie durch meine Test-Suite, und verpflichten nur jene Änderungen. (Nachdem sichergestellt war es funktioniert lokal und Bestehen aller Tests zuerst!)

git commit -m 'using correct column name instead of old stinky bad column name'

Dann würde ich schieben, dass die Produktion zu begehen.

An dieser Stelle können Sie die ursprüngliche Spalte ohne sich Gedanken über jede Art von Ausfallzeiten entfernen mit der Migration verbundenen selbst.

class RemoveBadColumnNames < ActiveRecord::Migration
  def up
    remove_column :table, :old_name_column_one
    remove_column :table, :old_name_column_two
  end

  def down
    add_column :table, :old_name_column_one, :string
    add_column :table, :old_name_column_two, :string
  end
end

Dann drücken Sie diese neueste Migration auf der Produktion und laufen bundle exec rake db:migrate im Hintergrund.

Ich weiß, das ist ein bisschen mehr beteiligt eines Prozesses, aber ich möchte lieber das tun, als habe Probleme mit meinem Produktions Migration.

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

Unter Available Transformations

rename_column(table_name, column_name, new_column_name):

Benennt eine Spalte, sondern hält die Art und Inhalt.

Führen Sie die folgenden Befehl, um eine Migrationsdatei zu erstellen:

rails g migration ChangeHasedPasswordToHashedPassword

Dann in der Datei, die in dem db/migrate Ordner, Schreib rename_column wie folgt:

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
  def change
     rename_column :table_name, :hased_password, :hashed_password
  end
end

Von API:

rename_column(table_name, column_name, new_column_name)

Es benennt eine Spalte, sondern hält die Art und Inhalt bleibt gleich.

Einige Versionen von Ruby on Rails Unterstützung up / down-Methode zur Migration und wenn Sie nach oben / unten Methode in der Migration, dann:

def up
    rename_column :table_name, :column_old_name, :column_new_name
end

def down
    rename_column :table_name, :column_new_name, :column_old_name
end

Wenn Sie die change Methode in der Migration haben, dann:

def change
    rename_column :table_name, :column_old_name, :column_new_name
end

Für weitere Informationen können Sie sich bewegen: Ruby on Rails - Migrations oder Active Record Migrations .

Wenn Ihr Code nicht mit anderen geteilt, dann beste Option ist nur rake db:rollback zu tun dann Spaltennamen in der Migration und rake db:migrate bearbeiten. Thats it

Und Sie können eine weitere Migration schreiben die Spalte umbenennen

 def change
    rename_column :table_name, :old_name, :new_name
  end

Das ist es.

Wenn Sie Spaltennamen wechseln müssen benötigen Sie einen Platzhalter erstellen doppelten Spaltennamen Fehler zu vermeiden. Hier ein Beispiel:

class SwitchColumns < ActiveRecord::Migration
  def change
    rename_column :column_name, :x, :holder
    rename_column :column_name, :y, :x
    rename_column :column_name, :holder, :y
  end
end

Als Alternative Option, wenn Sie nicht auf die Idee von Migrationen verheiratet sind, gibt es eine zwingende Juwel für Active die den Namen für Sie ändert sich automatisch, handhaben, DataMapper Stil. Alles, was Sie tun, ist der Spaltenname im Modell ändern (und stellen Sie sicher, dass Sie setzen Model.auto_upgrade! an der Unterseite des model.rb) und Viola! Die Datenbank ist im laufenden Betrieb aktualisiert.

https://github.com/DAddYE/mini_record

Hinweis: Sie nuke müssen db / schema.rb Konflikte verhindern

Immer noch in der Beta-Phase und offensichtlich nicht jedermanns Sache, aber immer noch eine überzeugende Wahl (ich bin derzeit mit es in zwei nicht-trivialer Produktion Anwendungen ohne Probleme)

Wenn die aktuellen Daten für Sie nicht wichtig sind, können Sie einfach nehmen Sie Ihre ursprüngliche Migration mit:

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

Ohne die Anführungszeichen, dann machen Sie Änderungen in der ursprünglichen Migration und die nach oben Migration erneut aus durch:

rake db:migrate

Sie einfach eine neue Migration erstellen, und in einem Block, Verwendung rename_column wie unten.

rename_column :your_table_name, :hased_password, :hashed_password

Für Ruby on Rails 4:

def change
    rename_column :table_name, :column_name_old, :column_name_new
end

Manuell können wir die folgenden Verfahren verwendet werden:

Wir können die Migration manuell bearbeiten wie:

  • Öffnen app/db/migrate/xxxxxxxxx_migration_file.rb

  • Update hased_password auf hashed_password

  • Führen Sie den folgenden Befehl

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

Dann wird es die Migration entfernen:

$> rake db:migrate:up VERSION=xxxxxxxxx

Es wird Ihre Migration mit der aktualisierten Änderung hinzuzufügen.

Generieren Sie die Migrationsdatei:

rails g migration FixName

# Erzeugt db / migrate / xxxxxxxxxx.rb

Bearbeiten Sie die Migration deinen Willen zu tun.

class FixName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

Ausführen rails g migration ChangesNameInUsers (oder was auch immer Sie möchten, es nennen)

Öffnen Sie die Migrationsdatei, die gerade erzeugt hat, und fügen Sie diese Zeile in dem Verfahren (zwischen def change und end):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

Speichern Sie die Datei, und führen Sie rake db:migrate in der Konsole

Überprüfen Sie Ihre schema.db, um zu sehen, ob der Name tatsächlich in der Datenbank geändert hat!

Hope, das hilft:)

$:  rails g migration RenameHashedPasswordColumn
invoke  active_record
      create    db/migrate/20160323054656_rename_hashed_password_column.rb

Öffnen dass Migrationsdatei und ändern Sie diese Datei wie unten (Do ursprüngliche table_name eingeben)

class  RenameHashedPasswordColumn < ActiveRecord::Migration
  def change
    rename_column :table_name, :hased_password, :hashed_password
  end
end
 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

Legen Sie eine Ruby on Rails Migration :

$:> rails g migration Fixcolumnname

Einfügen Code in der Migrationsdatei (XXXXXfixcolumnname.rb) :

class Fixcolumnname < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

Lassen Sie uns KISS . Es braucht nur drei einfachen Schritten. Folgende Arbeiten für Rails 5.2 .

1. Erstellen Sie eine Migration

  • rails g migration RenameNameToFullNameInStudents

  • rails g RenameOldFieldToNewFieldInTableName - auf diese Weise es zu Maintainer der Codebasis klar ist perfekt später. (Verwenden Sie einen Plural für die Tabellennamen).

2. Bearbeiten Sie die Migration

# I prefer to explicitly write theupanddownmethods.

# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb

class RenameNameToFullNameInStudents < ActiveRecord::Migration[5.2]
  def up
    # rename_column :table_name, :old_column, :new_column
    rename_column :students, :name, :full_name
  end

  def down
            # Note that the columns are reversed
    rename_column :students, :full_name, :name
  end
end

3. Führen Sie Ihre Migrationen

rake db:migrate

Und Sie zu den Rennen sind weg!

Öffnen Sie Ihre Ruby on Rails-Konsole und geben Sie ein:

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column

Sie haben zwei Möglichkeiten, dies zu tun:

  1. Bei dieser Art läuft es automatisch den Rückwärts Code davon, wenn das Rollback.

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. Um diese Art, es läuft die up-Methode, wenn rake db:migrate und führt die down-Methode, wenn rake db:rollback:

    def self.up
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
    def self.down
      rename_column :table_name,:new_column_name,:old_column_name
    end
    

Ich bin auf Schienen 5.2 und versuchen, eine Spalte auf einem devise Benutzer umbenennen.

das rename_column Bit funktionierte für mich, aber der singulären :table_name wirft eine „User-Tabelle nicht gefunden“ Fehler. Plural arbeitete für mich.

rails g RenameAgentinUser

Dann ändern Migrationsdatei folgt aus:

rename_column :users, :agent?, :agent

Wo: Agent? ist der alte Spaltenname.

Just erzeugt Migrationsbefehl mit

rails g migration rename_hased_password

Nach diesem bearbeitet die Migration add in Änderungsverfahren folgende Zeile

rename_column :table, :hased_password, :hashed_password

Dies sollte den Trick tun.

Schienen 5 Migration Änderungen

Beispiel:

  

Schienen g Modell: Student student_name: string Alter: integer

Wenn Sie ändern möchten student_name Spalte Namen

Hinweis: - wenn Sie nicht Laufschienen db: migrate

Sie können folgende Schritte durchführen

  

Schienen d Modell Studenten student_name: string Alter: integer

Dies wird erzeugt Migrationsdatei entfernen, Jetzt können Sie Ihre Spaltennamen korrigieren

  

Schienen g Modell: Student Name: string Alter: integer

Wenn Sie migriert (Schienen db: migrate), folgende Optionen zu ändern Spaltenname

  

Schienen g Migration RemoveStudentNameFromStudent student_name: string

     

Schienen g Migration AddNameToStudent Name: string

Aktualisieren - Ein naher Verwandter von create_table change_table ist, verwendet für vorhandene Tabellen ändern. Es wird in ähnlicher Weise verwendet, um create_table aber das Objekt auf den Block kennt mehr Tricks ergibt. Zum Beispiel:

class ChangeBadColumnNames < ActiveRecord::Migration
  def change
    change_table :your_table_name do |t|
      t.rename :old_column_name, :new_column_name
    end
  end
end

Auf diese Weise ist effizienter, wenn wir mit anderen alten Methoden wie tun: Entfernen / add index / remove Index / add Spalte, zB können wir weiter wie:

# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top