2012-11-20 8 views
16

In meiner general_exams Tabelle habe ich eine Spalte mit dem Namen semester, Typ ist string. Jetzt möchte ich seinen Namen in semester_id ändern, geben Sie integer ein. Ich habe über Migration gelesen und es hat verfügbaren Transformationen:So benennen Sie eine Spalte um und ändern ihren Typ durch gleichzeitige Migration

  • rename_column (table_name, column_name, new_column_name): Benennt eine Spalte, sondern hält die Art und Inhalt.
  • change_column (Tabellenname, Spaltenname, Typ, Optionen): Ändert die Spalte unter Verwendung derselben Parameter wie add_column in einen anderen Typ.

Also, ich meine Migration-Datei wie folgt zu erstellen:

class RenameSemesterFromGeneralExams < ActiveRecord::Migration 

    def change 
    rename_column :general_exams, :semester, :semester_id 
    change_column :general_exams, :semester_id, :integer 
    end 
end 

Aber, wenn ich rake db:migrate laufen, es hat Fehler:

== RenameSemesterFromGeneralExams: migrating ================================= 
-- rename_column(:general_exams, :semester, :semester_id) 
    -> 0.0572s 
-- change_column(:general_exams, :semester_id, :integer) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

PG::Error: ERROR: column "semester_id" cannot be cast to type integer 
: ALTER TABLE "general_exams" ALTER COLUMN "semester_id" TYPE integer 

In meinem Tisch GeneralExam, zerstörte ich alle Daten . Also, jeder kann mir sagen, wie kann ich das tun? Oder ich muss zwei Migrationsdateien erstellen?

+2

Diese Frage eigentlich wirklich hilfreich ist, da neben dem Störungshoffnungproenergie, es genau gibt an, wie einen Spaltennamen ändern und tippe die Frage selbst ein! – EdgeCaseBerg

Antwort

9

Ihr Problem ist wahrscheinlich, dass die semester Daten enthält, die nicht in integers konvertiert werden können. Deshalb erhalten Sie einen Cast-Fehler.

Ich vermute, Sie müssen mehr Arbeit zu tun, um dies zu arbeiten, als das einzige, was in den Sinn kommt, ist das Entfernen der Spalte und Erstellen eines neuen mit den richtigen Werten.

Aber Sie können einfach remove_column und dann add_column in einer Migration. Das sollte einwandfrei funktionieren.

Ich würde auch vorschlagen, dass Sie erst add_column zuerst, dann tun Sie den Zuordnungsprozess, wo Sie den alten semester Wert auf die neue semester_id abbilden und dann die Spalte fallen lassen.

Denken Sie daran, dass Sie ActiveRecord-Manipulationen innerhalb Ihrer Migration durchführen können. Du kannst also den Code dort hineinlegen.

+0

Ich habe alle Daten in der Tabelle GeneralExam zerstört. Wenn ich keine Möglichkeit finde, die gleiche Zeit zu tun, werde ich 2 Migration erstellen, aber ich denke, es ist nicht bequem. Danke für die Antwort. – Thanh

+0

Meine Antwort wurde mit weiteren Details aktualisiert. – Tigraine

+0

Ich brauche keine alten Daten der Semesterspalte. Also remove_column oder add_column zuerst vielleicht kein Problem. Ich werde es so machen, danke. – Thanh

0

Dieser Fehler ist, weil es Daten in den Tabellen (oder Standardwerte, vielleicht ..) gibt, die PG nicht wissen, wie man von String zu Integer konvertiert. Entweder die Daten loswerden oder PG sagen, wie Sie es konvertieren wollen, mit PG-spezifischen SQL (ich denke, Sie wollen USING) und execute Migrationsbefehl. Weitere Informationen finden Sie in den Rails-Handbüchern zu Migrationen.

+0

Ich habe alle Daten in dieser Tabelle zerstört. Du meinst, ich sollte rauf und runter gehen? – Thanh

+0

Wenn Sie alle Daten zerstört haben, kann ich nur daran denken, dass die Spalte möglicherweise einen Standardwert hat (der nicht in ganze Zahlen konvertiert werden kann). Ich bin kein PG erwarten. –

+0

Ich setze keinen Standardwert für diese Spalte, ich verstehe auch nicht, warum ich den Typ nicht ändern kann, wenn die Spalte keinen Wert hat. Also musste ich den anderen Weg wählen. Lol, ich bin auch kein Experte, ich bin immernoch nur Student :)) – Thanh

13

Dies funktioniert wie Rails 4

def change 
    rename_column :general_exams, :semester, :semester_id 
    change_column :general_exams, :semester_id, :integer 
end 
0

ich diese Hilfe in ihm

 
class ModifyColumnTables 
    def change 
    remove_column :posts, :old_column 
    add_column :posts, :new_column, :type_of_column 
    end 
end 
Verwandte Themen