railsで開発していたアプリをherokuでデプロイすることにしました。
当初、アプリをherokuでデプロイする予定ではなかったので、DBはMySQLだったものを本番環境だけPostgreSQLに移行することにしました。(本当は悪手かもしれませんが、、)
その経緯をまとめたのが下記記事です。
今回はその際に躓いたエラーと解消までの道のりです。
herokuで
$ rails db:migrate
した際に
rails aborted! StandardError: An error has occurred, this and all later migrations canceled: PG::DatatypeMismatch: ERROR: column "business_time" cannot be cast automatically to type text HINT: You might need to specify "USING business_time::text". : ALTER TABLE "shops" ALTER COLUMN "business_time" TYPE text[]
というエラー発生。
アプリ開発段階でカラムの1つに「文字列の配列」をデータ型に選択したことがありました。
途中でそのカラムは削除し、通常の「文字列」に変更したのですが、
migrationファイルに
db/migrate/20210205024357_change_datetype_business_time_of_shops.rb
class ChangeDatetypeBusinessTimeOfShops < ActiveRecord::Migration[5.2]
def change
change_column :shops, :business_time, :text, array: true
end
end
というファイルが残ってしまっていた為に、postgresqlに変換する際エラーが発生しているようでした。(開発段階では後に上記カラムを削除するmigrationファイルを追加してますが、postgresqlでは上記migrationファイルを読み込んだ時点でエラーとなり、rollbackしてしまっているようでした)
色々、ググってみて、migrationファイルをdownした状態で削除→rails db:migrateする方法を取りました。
該当migrationファイルだけdownさせればいい話だと思うのですが、当時はいまいち事態を把握できておらず、ローカル環境で
$ rails db:migrate reset
してから該当ファイルを削除した後、githubに反映させるつもりでした。
が、下記エラーが
rails aborted!
ActiveRecord::NoEnvironmentInSchemaError:
Environment data not found in the schema. To resolve this issue, run:
上記のエラー文に従って下記実行
改めて
$ rails db:migrate reset
問題なく実行できたので、問題のあったmigrationファイルを削除しました。
その後、githubにプッシュしたものの、何故か反映されませんでした。
ので、github上で直接問題のあったファイルを削除し、改めてherokuコンソールでrails db:migrateすることで解決しました。