PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Modifica di un tipo di colonna in stringhe più lunghe nei binari

Dovresti usare text con Rails se vuoi una stringa senza limiti di lunghezza. Una migrazione come questa:

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

dovrebbe sistemare le cose. Potresti volere :null => false o anche altre opzioni alla fine.

Quando usi una string colonna senza un limite esplicito, Rails aggiungerà un implicito :limit => 255 . Ma se usi text , otterrai qualsiasi tipo di stringa di lunghezza arbitraria supportato dal database. PostgreSQL ti permette di usare un varchar colonna senza una lunghezza, ma la maggior parte dei database usa un tipo separato per questo e Rails non sa di varchar senza una lunghezza. Devi usare text in Rails per ottenere un text colonna in PostgreSQL. Non c'è differenza in PostgreSQL tra una colonna di tipo text e uno di tipo varchar (ma varchar(n) è diverso). Inoltre, se stai implementando su PostgreSQL, non c'è motivo di usare :string (AKA varchar ) il database tratta il text e varchar(n) lo stesso internamente ad eccezione dei vincoli di lunghezza extra per varchar(n); dovresti usare solo varchar(n) (AKA :string ) se hai un vincolo esterno (come un modulo governativo che dice che il campo 432 sul modulo 897/B sarà lungo 23 caratteri) sulla dimensione della colonna.

Per inciso, se stai usando una string colonna ovunque, dovresti sempre specificare il :limit come promemoria per te stesso che esiste un limite e dovresti avere una convalida nel modello per assicurarti che il limite non venga superato. Se superi il limite, PostgreSQL si lamenterà e solleverà un'eccezione, MySQL troncherà silenziosamente la stringa o si lamenterà (a seconda della configurazione del server), SQLite la farà passare così com'è e altri database faranno qualcos'altro (probabilmente si lamenteranno) .

Inoltre, dovresti anche sviluppare, testare e distribuire sullo stesso database (che di solito sarà PostgreSQL su Heroku), dovresti anche usare le stesse versioni del server di database. Esistono altre differenze tra i database (come il comportamento di GROUP BY) da cui ActiveRecord non ti isola. Potresti già farlo, ma ho pensato di menzionarlo comunque.

Aggiorna :Le versioni più recenti di ActiveRecord comprendono varchar senza limiti quindi, almeno con PostgreSQL, puoi dire:

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

per modificare un varchar(n) colonna a varchar . text e varchar sono sempre la stessa cosa per quanto riguarda PostgreSQL, ma alcuni costruttori di moduli li tratteranno in modo diverso:varchar ottiene un <input type="text"> mentre text ottiene un <textarea> a più righe .