** "Cela a l'air bien avec date
au lieu de cette colonne" datetime` "**
J'ai utilisé datetime
pour gérer la date, mais quand j'y pense attentivement, je n'ai pas besoin de" time ", donc je veux le convertir en date
.
release_at (datetime)
--Je veux migrer vers release_on (date)
def change
rename_column :books, :released_at, :released_on
change_column :books, :released_on, 'date USING CAST(released_on AS date)'
end
db: rollback
?Tout va bien, veuillez patienter un moment avec git commi ..
, **! ** **
Gardez à l'esprit que les migrations reviennent.
Voyons si nous pouvons annuler la migration mentionnée ci-dessus.
$ rails db:rollback
== ..... : reverting ========
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
This migration uses change_column, which is not automatically reversible.
To make the migration reversible you can either:
1. Define #up and #down methods in place of the #change method.
2. Use the #reversible method to define reversible behavior.
--Lorsque vous revenez avec change_column
, vous ne pouvez pas le restaurer car vous ne connaissez pas les informations de type précédentes.
J'ai pu convertir le type avec `` 'date USING CAST (published_on AS date)' ', mais la restauration a échoué car ** "informations de type avant conversion" ** manquait.
Pour résoudre ce problème, réécrivons-le en tant que méthode ** up / down **.
def up
rename_column :books, :published_at, :release_on
change_column :books, :release_on, 'date USING CAST(release_on AS date)'
end
def down
rename_column :books, :release_on, :published_at
change_column :books, :published_at, 'timestamp USING CAST(published_at AS timestamp)'
end
En faisant cela
--db: migrate
exécute datetime-> date
de ʻup --
db: rollback exécute
down
date-> datetime`
datetime USING CAST
donne une erreur dans PostgreSQLchange_column :books, :released_at, 'datetime USING CAST(released_at AS datetime)'
PG::UndefinedObject: ERROR: type "datetime" does not exist
LINE 1: ...released_at" TYPE datetime USING CAST(published_at AS datetime)
Il a été dit que «datetime» dans le monde Rails devient «timestamp» dans le monde PostgreSQL: sweat_smile:
Recommended Posts