Rails-Migration verändernden Spalte zu verwenden Postgres arrays
Ich versuche mich zu ändern eine Spalte in meiner Datenbank, so dass Sie es verwenden können, die Postgres-array-Daten Typ.
Aktuell der Tabellen-Spalte ist vom Typ string.
Ich bin mit der folgenden migration zu konvertieren:
def change
change_column :table, :dummy_column, :text, array: true, default: []
end
Aber ich bekomme die folgende Fehlermeldung:
bundle exec rake db:migrate
rake aborted!
An error has occurred, this and all later migrations canceled:
PG::Error: ERROR: column "dummy_column" cannot be cast automatically to type character varying[]
HINT: Specify a USING expression to perform the conversion.
: ALTER TABLE "table" ALTER COLUMN "dummy_column" TYPE character varying(255)
Tasks: TOP => db:migrate
- Sie können change_column :Tabelle :dummy_column, :string -, array: true, default: [] anstelle von text Sie können Ihr problem beheben
Du musst angemeldet sein, um einen Kommentar abzugeben.
PostgreSQL nicht wissen, wie Sie automatisch zu konvertieren, eine Spalte mit
varchar
in ein array vonvarchar
. Er weiß nicht, was Sie beabsichtigen, da es keine Möglichkeit hat zu wissen, was format, das Sie denken, die aktuellen Werte sind in.So müssen Sie es sagen; das ist es, was die
USING
- Klausel ist für.ActiveRecord scheint nicht explizit für die
USING
- Klausel (nicht verwunderlich, da es kaum unterstützt sogar die meisten basic-Datenbank-features). Sie können Ihre eigenen SQL-text für die migration, obwohl.Vorausgesetzt, die Saiten sind durch Kommas getrennt und können selbst keine Kommas enthalten, zum Beispiel:
(Ich glaube nicht, verwenden Sie Schienen, mir und noch nicht getestet, aber es ist konsistent mit der syntax in den Beispielen verwendeten anderswo).
Mit Rails 4.2 auf der postgresql-9.4, ich war auf der Suche, dies zu tun und erhalten meine bereits vorhandenen string-Daten als erstes element in ein element eines arrays.
Es stellt sich heraus, dass postgresql nicht zwingen, eine Zeichenfolge in einem text-array ohne VERWENDUNG von expression zu sagen, wie.
Nach viel Gefummel mit empfindlichen postgres-syntax, fand ich einen guten Mittelweg mit active record:
Die einzige direkte postgresql gibt es die
(string_to_array() )
Aufruf der Funktion. Hier sind die docs auf, dass- beachten Sie, dass Sie zu liefern haben, ein Trennzeichen.Mit Rails 4.2 auf postgresql 9.4 mit einem down-und einem up base auf lrrthomas Antwort.
Hinweis: Ihre erste Spalte sollte eine default nil
Hinweis:
er spezifiziert, wie Daten Typ :string mit array: true, um die Spalte standardmäßig auf einen leeren array ein ( [] ) verwenden Sie Standardwert: '{}'