PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Ändern eines Spaltentyps in längere Zeichenfolgen in Schienen

Sie sollten text verwenden mit Rails, wenn Sie eine Zeichenfolge ohne Längenbegrenzung wünschen. Eine Migration wie diese:

def up
  change_column :your_table, :your_column, :text
end
def down
  # This might cause trouble if you have strings longer
  # than 255 characters.
  change_column :your_table, :your_column, :string
end

sollte die Sache regeln. Vielleicht möchten Sie :null => false oder einige andere Optionen am Ende davon.

Wenn Sie eine string verwenden Spalte ohne explizites Limit, fügt Rails ein implizites :limit => 255 hinzu . Aber wenn Sie text verwenden , erhalten Sie jeden Zeichenfolgentyp mit beliebiger Länge, den die Datenbank unterstützt. PostgreSQL ermöglicht die Verwendung eines varchar Spalte ohne Länge, aber die meisten Datenbanken verwenden dafür einen separaten Typ und Rails kennt varchar nicht ohne Länge. Sie müssen text verwenden in Rails, um einen text zu erhalten Spalte in PostgreSQL. In PostgreSQL gibt es keinen Unterschied zwischen einer Spalte vom Typ text und eine vom Typ varchar (aber varchar(n) ist anders). Wenn Sie darüber hinaus PostgreSQL bereitstellen, gibt es keinen Grund, :string zu verwenden (AKA varchar ) behandelt die Datenbank text und varchar(n) intern dasselbe, mit Ausnahme der zusätzlichen Längenbeschränkungen für varchar(n); Sie sollten nur varchar(n) verwenden (AKA :string ), wenn Sie eine externe Einschränkung (z. B. ein Regierungsformular, das besagt, dass Feld 432 auf Formular 897/B 23 Zeichen lang sein wird) für die Spaltengröße haben.

Nebenbei, wenn Sie einen string verwenden Spalte überall, sollten Sie immer :limit angeben als Erinnerung daran, dass es eine Grenze gibt und Sie eine Validierung im Modell haben sollten, um sicherzustellen, dass die Grenze nicht überschritten wird. Wenn Sie das Limit überschreiten, beschwert sich PostgreSQL und löst eine Ausnahme aus, MySQL schneidet die Zeichenfolge stillschweigend ab oder beschwert sich (abhängig von der Serverkonfiguration), SQLite lässt sie so passieren, wie sie ist, und andere Datenbanken werden etwas anderes tun (wahrscheinlich beschweren). .

Außerdem sollten Sie auch auf derselben Datenbank entwickeln, testen und bereitstellen (was bei Heroku normalerweise PostgreSQL sein wird), Sie sollten sogar dieselben Versionen des Datenbankservers verwenden. Es gibt andere Unterschiede zwischen Datenbanken (wie das Verhalten von GROUP BY), vor denen ActiveRecord Sie nicht isoliert. Vielleicht machst du das schon, aber ich dachte, ich erwähne es trotzdem.

Aktualisieren :Neuere Versionen von ActiveRecord verstehen varchar ohne Limit also, zumindest mit PostgreSQL, kann man sagen:

change_column :your_table, :your_column, :string, limit: nil

um ein varchar(n) zu ändern Spalte zu varchar . text und varchar sind für PostgreSQL immer noch dasselbe, aber einige Formularersteller behandeln sie anders:varchar erhält einen <input type="text"> wohingegen text erhält einen mehrzeiligen <textarea> .