2010-08-21 19 views
23

E 'possibile cambiare un campo che è una stringa in un intero senza cancellare i dati già inseriti?Rails Migrazione per convertire stringa in intero?

La struttura db corrente per la tabella in questione è:

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

Questo è possibile utilizzando le migrazioni?

Sto pensando, forse, nella migrazione rilascia il vecchio campo, ne creo uno nuovo che è un numero intero, ma sono preoccupato che questo cancellerà tutti i dati già inseriti.

Grazie,

Danny

risposta

28

Non far cadere la colonna, sarà chiaro i dati.

È possibile tuttavia provare

change_column :people, :company_id, :integer 

e se tutti i valori company_id possono essere convertiti in integer, si dovrebbe andare bene.

Se ciò non è il caso (ovvero non tutta la stringa può essere convertita per impostazione predefinita), è possibile farlo in due passaggi: 1) creare una nuova colonna, quindi caricare company_id lì dopo una certa conversione. 2) rilascia company_id quindi rinomina la nuova colonna.

Si dovrebbe fare attenzione con entrambi i metodi (più per il secondo) e probabilmente si dovrebbe farlo prima su una copia del database, se possibile.

+0

grazie per migliorare la formattazione, jigfox – Zaki

+0

Grande, Grazie. Suppongo di non dover indicare il tipo corrente nel primo esempio? – dannymcc

+2

Il primo approccio ha generato errori per me quando ho inviato il codice a Heroku. PG :: DatatypeMismatch: ERRORE: colonna "company_id" non può essere eseguita automaticamente per digitare il numero intero SUGGERIMENTO: specificare un'espressione USING per eseguire la conversione. : ALTER TABLE "collaboratori" ALTER COLUMN "company_id" TYPE intero rastrello interrotto! StandardError: Si è verificato un errore, annullate tutte le successive migrazioni: PG :: DatatypeMismatch: ERRORE: colonna "company_id" non può essere eseguita automaticamente per digitare un numero intero SUGGERIMENTO: specificare un'espressione USING per eseguire la conversione. – Evolve

31

Non far cadere la colonna, utilizzare questo

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

Il "suggerimento" che hai da PostgreSQL fondamentalmente ti dice che è necessario confermare che si vuole che questo accada, e come i dati devono essere convertiti. Per confermare le modifiche, utilizzare il blocco di cui sopra nella migrazione

+0

Questa dovrebbe essere la risposta accettata – BananaNeil

8

Le altre risposte sono corrette, ma si può prendere un ulteriore passo avanti con la parola chiave :using:

change_column :people, :company_id, :integer, using: 'company_id::integer' 
Problemi correlati