J'ai un modèle avec une colonne de type integer
que je veux convertir en type string
. Maintenant, je cherche la meilleure façon de changer le type de colonne sans perdre les données. Existe-t-il un moyen indolore d'accomplir ceci?Rails: changer le type de colonne, mais conserver les données
Répondre
Une migration standard utilisant la méthode change_column convertira des entiers en chaînes sans aucune perte de données. rake db: rollback effectuera également la migration inverse sans erreur si nécessaire.
Voici la migration de test je confirmer ce comportement:
class ChangeAgeToString < ActiveRecord::Migration
def self.up
change_column :users, :age, :string
end
def self.down
change_column :users, :age, :integer
end
end
Pour une raison qui ne fonctionne pas pour moi. J'utilise les rails 3.2.13 avec mysql 14.14 sur un Mac, et la migration ci-dessus change tous mes: valeurs entières à 0 – gardenofwine
Je viens de re-testé avec les versions que vous avez mentionnées (Rails 3.2.13 et mysql Ver 14.14 Distrib 5.5.27, pour osx10.8 (i386) en utilisant readline 5.1). Tout a fonctionné comme prévu. Avant la migration (=> #
J'éprouve quelque chose de similaire à @gardenofwine mais en convertissant la colonne de 'time' en' datetime'. Si les données d'origine sont "09:30:30", après la migration, je reçois tous les zéros. J'utilise Rails 3.2.12 et la même version de mysql que @Jon. Une idée de comment cela peut arriver. – elhoyos
Si c'est un unique, vous pouvez simplement changer le type de colonne dans la base de données (puisqu'aucune information est perdue passer d'int à varchar)
Pour MySQL, cela ferait:
ALTER TABLE t1 MODIFY col1 VARCHAR(256)
Si vous utilisez SQLite, vous n'aurez rien à faire.
J'utilise postgresql dans le projet actuel et cela a fonctionné aussi! Merci pour votre réponse, j'ai mis le message suivant comme réponse acceptée simplement parce que je pense que la plupart des utilisateurs qui ont cette question pourraient avoir besoin d'une migration. – blissini
Cool. Oui, la réponse de migration est la meilleure. J'étais en train de travailler sur une base de données MySql à l'époque, donc la réponse à la base de données me semblait d'abord! –
pour postgres dans la migration
change_column :table_name, :field,'boolean USING (CASE field WHEN \'your any string as true\' THEN \'t\'::boolean ELSE \'f\'::boolean END)'
et à tout type valide similaire
Si vous utilisez Postgres, vous ne pouvez pas renvoyer implicitement une chaîne à un entier, donc la manière de rendre le changement réversible est:
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
pour postgresql, colonne table à langer datatype integer
-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. changer le nom de la colonne Rails
- 2. SQLite Ajouter une colonne, conserver les données
- 3. comment changer le type de colonne dans radgridview
- 4. Utiliser applymap sur DataFrame mais conserver les informations d'index/colonne
- 5. Comment changer le type de données d'une colonne contenant des données dans le serveur sql?
- 6. PostgreSQL: changer une colonne de type ENUM
- 7. Est-ce que changer le type de données d'une colonne après que les données sont déjà là détruit les données?
- 8. Comment changer le type de colonne dans Heroku?
- 9. Modifier le graphique mais conserver les propriétés
- 10. Comment changer le type de colonne de matrice dans R
- 11. modifier le type de données d'une colonne
- 12. rails - .find renvoie les données de la base de données mais la colonne manquante
- 13. Comment changer de type colonne datatable
- 14. Modifier le type de données de colonne du serveur SQL
- 15. Comment changer le type de collation pour une colonne MySQL?
- 16. Comment changer le type d'un nom de colonne dans Cassandra?
- 17. Type de colonne 'set' et Rails
- 18. Changer les rails text_field formulaire type de générateur
- 19. comment conserver les noms de colonne sur le pivot dynamique
- 20. Une manière élégante de changer le type de colonne dans la trame de données dans R
- 21. null modification de colonne type de données
- 22. Essayer de modifier le type de colonne, mais obtenir erreur
- 23. Modification du type de données d'une colonne
- 24. Est-il possible de changer le type de données d'une colonne dans une vue?
- 25. requête Sql pour trier les données sur une seule colonne, mais pas changer les autres colonnes
- 26. Détruire la session mais conserver les données flash
- 27. Code VBA, mais doit conserver les lignes sans données
- 28. Utilisez la colonne, mais ignorez les données dans la colonne
- 29. renommer la colonne sans changer son type
- 30. SQL: Changer le type de données d'une colonne de String à Numérique
Est-ce une seule fois, ou voulez-vous que cela fonctionne à plusieurs reprises, par exemple, dans une migration? –