2010-08-21 9 views
23

Ist es möglich, ein Feld, das eine Zeichenfolge ist, in eine ganze Zahl zu ändern, ohne die bereits eingegebenen Daten zu löschen?Rails Migration zum Konvertieren von String in Integer?

Die aktuelle DB-Struktur für die Tabelle in Frage:

create_table :people do |t| 
t.string :company_id 

dies möglich unter Verwendung von Migrationen ist?

Ich denke, vielleicht in der Migration das alte Feld fallen lassen, erstellen Sie eine neue, die eine ganze Zahl ist - aber ich mache mir Sorgen, dies wird alle bereits eingegebenen Daten löschen.

Danke,

Danny

Antwort

28

die Spalte nicht fallen lassen, werden die Daten löschen.

können Sie versuchen jedoch

change_column :people, :company_id, :integer 

und wenn alle Werte in company_id-integer umgewandelt werden kann, sollte es in Ordnung sein.

Wenn dies nicht der Fall ist (dh nicht alle Zeichenfolgen können standardmäßig konvertiert werden), können Sie dies in zwei Schritten tun: 1) Erstellen Sie eine neue Spalte und laden Sie nach einer Konvertierung die company_id. 2) Drop Company_id dann die neue Spalte umbenennen.

Sie sollten vorsichtig mit beiden Methoden sein (mehr für die zweite) und Sie sollten es wahrscheinlich zuerst auf einer Kopie der Datenbank tun, wenn Sie können.

+0

Dank für die Verbesserung der Formatierung, jigfox – Zaki

+0

Große, Vielen Dank. Ich nehme an, dass ich im ersten Beispiel nicht den aktuellen Typ angeben muss. – dannymcc

+2

Der erste Ansatz erzeugte Fehler für mich, als ich den Code nach Heroku schob. PG :: DatatypeMismatch: FEHLER: Die Spalte "company_id" kann nicht automatisch in den Typ Integer umgewandelt werden. HINWEIS: Geben Sie einen USING-Ausdruck an, um die Konvertierung durchzuführen. : ALTER TABLE "Mitbearbeiter" ALTER COLUMN "company_id" TYPE Ganzzahl Rake abgebrochen! Standarderror: ein Fehler aufgetreten ist, dieses und alle späteren Migrationen abgebrochen: PG :: DatatypeMismatch: ERROR: Spalte „company_id“ kann nicht automatisch gegossen werden integer Hinweis zu geben: Geben Sie eine unter Verwendung von Expressions die Umwandlung durchzuführen. – Evolve

31

Sie die Spalte nicht fallen lassen, benutzen Sie diese

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)' 

Der „Hinweis“ Sie von PostgreSQL bekam man im Grunde sagt, dass Sie Sie dies geschehen soll, bestätigen müssen, und wie Daten konvertiert werden sollen. Um die Änderungen zu bestätigen, verwenden Sie den Block oben in der Migration

+0

Dies sollte die akzeptierte Antwort sein – BananaNeil

8

Die anderen Antworten sind richtig, aber Sie können noch einen Schritt weiter mit dem :using Stichwort nehmen:

change_column :people, :company_id, :integer, using: 'company_id::integer' 
Verwandte Themen