質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Heroku

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1318閲覧

heroku run rails db:migrateをした時のPG::DatatypeMismatchエラー

hanayama

総合スコア11

Heroku

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/11/14 01:27

前提・実現したいこと

RubyOnRailsでwebアプリを作っています。
Railsアプリをherokuにデプロイし、heroku run rails db:migrate とした時、デフォルトを整数型に自動的にキャストすることはできませんというエラーが出てしまいます。
いろいろ調べてやってみましたがうまくいきません。

わかる方いましたら是非知恵を貸して頂きたいです。

発生している問題・エラーメッセージ

D, [2020-11-13T22:57:50.454435 #4] DEBUG -- : (4.7ms) ALTER TABLE "habits" ALTER COLUMN "complete" TYPE integer USING complete :: integer D, [2020-11-13T22:57:50.456618 #4] DEBUG -- : (1.8ms) ROLLBACK D, [2020-11-13T22:57:50.459004 #4] DEBUG -- : (2.0ms) SELECT pg_advisory_unlock(4351659385779522495) rails aborted! StandardError: An error has occurred, this and all later migrations canceled: PG::DatatypeMismatch: ERROR: default for column "complete" cannot be cast automatically to type integer

該当のソースコード

class ChangeDatatypecompleteOfHabits < ActiveRecord::Migration[6.0] def up change_column :habits, :complete, :integer, using: 'complete :: integer' end def down change_column :habits, :complete, :boolean, default: false, null: false end end 一度removeして作り直してます。 class RemoveCompleteFromHabits < ActiveRecord::Migration[6.0] def change remove_column :habits, :complete, :integer end end class AddComplete2ToHabits < ActiveRecord::Migration[6.0] def change add_column :habits, :complete, :integer, default: 0, null: false end end

試したこと

まず最初のエラー文で ヒント: USINGを指定してくださいのように出たので、migrationファイルを下記のように変更しました。

change_column :habits, :complete, :integer, using: 'complete :: integer'

そしたらUSINGを指定してくださいという表記は消えましたが、結局エラーは解決してませんでした。

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

Rails 6.0.3.4
ruby 2.6.3p62

ここにより詳細な情報を記載してください。

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

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

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

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

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

hatsu

2020/11/14 03:56

すでにcompleteカラムにfalseが入っているため、整数型に型を変えようとしたときにエラーが発生しているのかな、と思いました。completeカラムにtrue/falseのようなデータって入っていたりしますでしょうか?
hanayama

2020/11/14 04:22

ご回答ありがとうございます!! 新しく作り直したファイルではcompleteカラムはdefaultで0を入れてます。 change_columnでbooleanからintegerに型を変更したのですが変更前のboolean型の時はdefault: falseにしてました。 質問の意図間違えていたらすみません。
hatsu

2020/11/14 04:27

> 変更前のboolean型の時はdefault: falseにしてました。 ですよね。なのですでにもしhabitsテーブルにデータがあったら、completeカラムの値はTrue/Falseになっていると思います。これは整数ではないです。 この状態で、completeカラムをBooleanからInteger(整数)には出来ないと思うので 1. Hobitsテーブルにcompleteカラムの値がTrue/Falseのデータ存在するか 2. 存在するならば、そのデータを削除する みたいなことが必要かと考えています。
hanayama

2020/11/14 04:42

booleanのdefault: falseの部分を消し、rails db:migrate:resetしてもう一度やってみたら出来ました!! 本当にありがとうございます!
hatsu

2020/11/14 04:45

お、よかったです!解決の流れ整理して回答として記載しておきます
guest

回答1

0

ベストアンサー

エラーメッセージで、completeカラムを整数にできないというようなことを言われています。

default for column "complete" cannot be cast automatically to type integer

過去のMigrationファイルをみるとcompleteカラムの型がBooleanだったと思われます。そしてデフォルトでFalseが入っているようです。
つまりこの時点でデータがあると、True/Falseのいずれかが入っています。

True/Falseのデータが入っているカラムを現在Integerにしようとしているため、先のエラーが発生したと思われます。

解決するために、
completeカラムがTrue/Falseになっているデータを削除、してから Migrationするといいと思います

投稿2020/11/14 04:50

hatsu

総合スコア1809

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問