Tengo un modelo con una columna del tipo integer
que quiero convertir al tipo string
. Ahora estoy buscando la mejor manera de cambiar el tipo de columna sin perdiendo los datos. ¿Hay una manera indolora de lograr esto?Rieles: cambie el tipo de columna, pero guarde los datos
Respuesta
Una migración estándar utilizando el método change_column convertirá enteros en cadenas sin pérdida de datos. rake db: rollback también hará la migración inversa sin error si es necesario.
Aquí es la migración de prueba he usado para confirmar este comportamiento:
class ChangeAgeToString < ActiveRecord::Migration
def self.up
change_column :users, :age, :string
end
def self.down
change_column :users, :age, :integer
end
end
Por alguna razón, eso no funciona para mí. Estoy usando rails 3.2.13 con mysql 14.14 en una Mac, y la migración anterior cambia todos mis valores enteros a 0 – gardenofwine
Acabo de volver a probar con las versiones que mencionaste (Rails 3.2.13 y mysql Ver 14.14 Distrib 5.5.27, para osx10.8 (i386) usando readline 5.1). Todo funcionó como se esperaba. Antes de la migración (=> #
Estoy experimentando algo similar a @gardenofwine pero convirtiendo la columna de 'time' a' datetime'. Si los datos originales son "09:30:30", después de la migración obtengo todos los ceros. Estoy usando Rails 3.2.12 y la misma versión de mysql que @Jon. Alguna idea de cómo puede suceder esto. – elhoyos
Si se trata de un hecho aislado que sólo puede cambiar el tipo de columna en la base de datos (ya que ninguna información se pierde en movimiento de int a varchar)
Para MySQL, esto lo haría:
ALTER TABLE t1 MODIFY col1 VARCHAR(256)
Si está usando SQLite no tendrá que hacer nada.
¡Utilizo postgresql en el proyecto actual y también funcionó! Gracias por su respuesta, configuré la siguiente publicación como la respuesta aceptada solo porque creo que la mayoría de los usuarios que tienen esta pregunta pueden necesitar una migración. – blissini
Cool. Sí, la respuesta de migración es la mejor. En realidad estaba trabajando, trabajando en un DB de MySql en ese momento, ¡así que la respuesta de la base de datos se me apareció primero! –
para postgres en la migración
change_column :table_name, :field,'boolean USING (CASE field WHEN \'your any string as true\' THEN \'t\'::boolean ELSE \'f\'::boolean END)'
y para cualquier tipo válido similares
Si utiliza Postgres, no puede convertir implícitamente una cadena en un entero, por lo que la forma de hacer que el cambio sea reversible es:
class ChangeAgeToString < ActiveRecord::Migration
def self.up
change_column :users, :age, :string
end
def self.down
add_column :age_integer
User.connection.execute('UPDATE users SET age_integer = cast(age as int)')
remove_column :users, :age
rename_column :users, :age_integer, :age
end
end
para PostgreSQL, mesa de cambio de la columna tipo de datos integer
a string
,
rails migration like this with up and down actions
class ChangeAgeToString < ActiveRecord::Migration
def self.up
change_column :users, :age, 'varchar USING CAST(age AS varchar)', null: false
end
def self.down
change_column :users, :age, 'integer USING CAST(age AS integer)', null: false, default: 0
end
end
- 1. Determinar el tipo de datos de una columna en SQLite
- 2. Obtener el tipo de datos de una columna ResultSet
- 3. Cambiar el tipo de columna sin perder datos
- 4. Servidor SQL: Comprobando el tipo de datos de una columna
- 5. Cambiar el tipo de datos de una columna en Oracle
- 6. Uso de ruby con bases de datos, pero sin rieles
- 7. Cambie los tipos de control (pero no los nombres) en el formulario con impacto mínimo
- 8. Hibernate, Postgresql: La columna "x" es de tipo oid pero la expresión es de tipo byte
- 9. Migraciones de rieles: intenté cambiar el tipo de columna de cadena a entero
- 10. En SQL Server cambie la columna de tipo int para escribir texto
- 11. Entidad Framework: herencia, cambie el tipo de objeto
- 12. Cambie el tramo de fila/columna mediante programación (tablelayoutpanel)
- 13. Cómo cambiar el tipo de datos de una columna de datos en una tabla de datos?
- 14. Conservar los índices SQL mientras se altera el tipo de datos de columna
- 15. Android: guarde el objeto android.net.Uri en la base de datos
- 16. Cómo subconjuntar la matriz en una columna, mantener el tipo de datos de matriz, mantener los nombres de fila/columna?
- 17. Guarde los archivos usando el clip a través de API
- 18. ¿Cómo alterno el tipo de datos de columna de tabla en más de 1 columna?
- 19. Modificar un tipo de columna con datos, sin borrar los datos
- 20. Rieles: ¿dónde colocar los archivos de datos?
- 21. Entity Framework: cómo obtener el tipo de datos de columna de base de datos de metadatos
- 22. Cambie el nombre de los nombres de las propiedades y cambie los valores de varios objetos
- 23. fecha Hibernate no guarde los milisegundos
- 24. Alterar el tipo de datos de columna en la base de datos de producción
- 25. selección de datos y la suma de una columna para una columna distinta en los datos
- 26. TYPO3: Cambie el complemento de USER_INT a USUARIO_INT tipo
- 27. columna "statement_date" es de tipo fecha, pero la expresión es de tipo entero
- 28. ¿Cómo puedo agregar el tipo de datos de columna después de agregar los encabezados de columna a mi tabla de datos?
- 29. Google Charts, ocultar la visualización de la columna, pero mantienen los datos subyacentes para su uso
- 30. ¿Qué tipo de columna mysql para serializar (datos)?
¿Es éste un hecho aislado, o les gustaría que en repetidas ocasiones funciona, por ejemplo, en una migración? –