2014-03-14 15 views
18

Es gibt eine gute Frage here Ich möchte näher darauf eingehen. Ich versuche, eine Spalte in meiner Datenbankform eine Zeichenfolge in eine ganze Zahl zu konvertieren.Rails Migration zum Konvertieren von Zeichenfolge in Ganzzahl mit Konvertierung

Ich dachte, die Konvertierung wäre ziemlich direkt forwrad. Derzeit meine Saiten sind

["10", "12", "125", "135", "140", ...] 

Meine Migrationsdatei enthält:

def change 
    change_column :table_name, :product_code, :integer 
end 

Rails versucht dies aber Postgresql thows wieder einen Fehler.

PG::Error: ERROR: column "product_code" cannot be cast automatically to type integer
HINT: Specify a USING expression to perform the conversion.

Ich bin mir nicht sicher, wie ich diesen 'VERWENDUNG' Ausdruck in meiner Schienenmigration benutze.

Also ich dachte, die Umwandlung wäre ziemlich geradlinig. Was soll ich als USING-Ausdruck verwenden?

+1

Vielen Dank für das Stellen dieser Frage. Weiter so –

+0

Ich habe ein Buch über SQL gelesen und schüttle jetzt den Kopf. Natürlich können Sie Zeichenketten nicht einfach in Ganzzahlen konvertieren, ohne einige SQL-Anweisungen zu verwenden, um zu sagen, wie Sie sie abbilden wollen. Ich wünschte, ich wüsste schon lange alles über SQL. –

Antwort

28
change_column :table_name, :product_code, 
    'integer USING CAST(product_code AS integer)' 

Quelle: http://makandracards.com/makandra/18691-postgresql-vs-rails-migration-how-to-change-columns-from-string-to-integer

+0

Scheint nicht mit leeren Zeichenfolgen zu arbeiten. 'ungültige Eingabesyntax für Integer:" " – dazonic

+0

Nun, das macht Sinn. Welche Ganzzahl würde eine leere Zeichenfolge darstellen? – Frans

+0

Setzt dies den Index zurück? Nach Durchführung einer solchen Migration bekomme ich falsch geordnete Abfragen. –

13

Adjusted Code zur Unterstützung der leeren Saiten Umwandlung auch:

change_column :table_name, :product_code, 
    "integer USING NULLIF(product_code, '')::int" 

Leere Zeichenfolge wird NULL, die 0 auf Typumwandlung wird, was wahrscheinlich das beste ist, dass Sie kann in dieser Situation tun.

+0

Funktioniert wie ein Charme. Ich hatte das gleiche Problem - die Migration von http://stackoverflow.com/a/22394425/1513205 funktioniert hervorragend auf einer leeren Datenbank - aber unsere Datenbank enthält bereits leere Zeichenfolgenwerte. – watts

0

Wenn Sie Rails Migrationen schreiben eine String-Spalte in eine ganze Zahl konvertieren würden Sie in der Regel wie folgt schreiben:

change_column :table_name, :column_name, :integer 

Sie könnten diese:

PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer 
HINT: Specify a USING expression to perform the conversion. 

Der „Hinweis“ im Grunde erzählt Sie müssen bestätigen, dass dies geschehen soll und wie Daten konvertiert werden sollen. Sagen Sie das einfach in Ihrer Migration:

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