🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

745閲覧

[Rails] herokuデプロイ時, 開発環境mysqlで本番環境postgreでカラムの型エラー

Romay

総合スコア40

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2019/03/31 01:28

Railsアプリをデプロイ時に、以下のようなエラーが出ました。

前提

Ruby 2.4.5
Rails 4.2.8
mysql(開発環境)
postgresql(本番環境)

以下実行

command

1git push heroku master

以下実行後にエラー

command

1heroku run rails db:migrate

エラー

terminal

1(省略) 2== 20190123183555 AddColumnToItem: migrated (0.0029s) ========================= 3 4 SQL (1.1ms) INSERT INTO "schema_migrations" ("version") VALUES ($1) [["version", "20190123183555"]] 5 (1.8ms) COMMIT 6Migrating to ChangeDatatypeCheckOfItems (20190203015612) 7 (1.4ms) BEGIN 8== 20190203015612 ChangeDatatypeCheckOfItems: migrating ======================= 9-- change_column(:items, :check, :boolean) 10 (1.8ms) ALTER TABLE "items" ALTER COLUMN "check" TYPE boolean 11 (1.4ms) ROLLBACK 12rake aborted! 13StandardError: An error has occurred, this and all later migrations canceled: 14 15PG::DatatypeMismatch: ERROR: column "check" cannot be cast automatically to type boolean 16HINT: You might need to specify "USING "check"::boolean". 17: ALTER TABLE "items" ALTER COLUMN "check" TYPE boolean

過去のマイグレーションファイルの中で、boolean型がmysqlとpostgreの間でうまく変換できていないものと思われます。

エラー文の、You might need to specify "USING "check"::boolean"
から、migrationファイルを作成し、カラムの型変更をしてみましたがどれもうまくいきません。

Ruby

1#うまくいかない 2class ChangeColumnToItem < ActiveRecord::Migration 3 def change 4 change_column :items, :check, "USING check::boolean" 5 end 6end 7#これもうまくいかない 8class ChangeColumnToItem < ActiveRecord::Migration 9 def change 10 change_column :items, :check, "USING "check"::boolean" 11 end 12end 13 14#これもうまくいかない 15class ChangeColumnToItem < ActiveRecord::Migration 16 def change 17 change_column :items, :check, 'boolean USING CAST(check AS boolean)' 18 end 19end

試してみたこと

USINGというのを使って指定する方法が検索してもほとんど出てこなく困っています。
また、postgreの文法だとうまくいかずSQLの文法で書けというエラーがでてしまいます。

また、開発環境と本番環境で違うデータベースを使うこと自体よくないと思うのですが、herokuにクレジットカード登録できないというエラーから、postgreでやるしか選択肢がない状態です。

参考記事

Migration doesn't work on Postgres

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

私も最近似たような経験があるのですが、どうも途中でカラムの型を変更している(ChangeColumnToItem)場合に関しては、integerやboolだとどうしても上手くherokuでは動作しないみたいです(なぜかStringだと上手くいったのが不思議ですが...)。
rails sでdevelopmentだと上手く行くんですけどね...なぜかherokuだと上手くいかない汗

どうしようもないので、

rails db:migrate:reset

を行なって、一旦マイグレーションをリセットしてから、ChangeColumnToItemに関連したファイルを全て削除して、元々のファイルかaddしているカラムのboolにしたい部分にbooleanを定義して、再度add commitしてpushしてみると良いかと思います...。

投稿2019/03/31 05:24

bamboo-nova

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Romay

2019/03/31 05:58

コメントありがとうございます。アドバイスいただいた通り、resetしたらうまくいきました!人生初のデプロイまでできて感激です...。 ありがとうございました!
guest

0

エラーになるのは、変換できない値があるのかもしれません。
Mysqlのboolean型について調べてみた

(PostgreSQL) 8.6. 論理値データ型

明示的な変換をしてみてはどうでしょうか。

SQL

1using case when check=0 then false else true end

または

SQL

1using case when check=0 then 0 else 1 end ::boolean

この対応でOKなら、0/1以外のデータが生成されているという事に対する手当も必要でしょうけど。

投稿2019/03/31 03:46

編集2019/03/31 04:04
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Romay

2019/03/31 06:00

コメントありがとうございます。他にこのエラーを経験した方もいらっしゃったようでうまくいきました!heroku側の何かしらのバグだったようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問