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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Heroku

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

PostgreSQL

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

Q&A

解決済

1回答

1218閲覧

ローカルで実行済み、githubにpush済みのマイグレーションファイルを、Herokuにpushする際に削除してよいか

YO14

総合スコア45

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Heroku

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

PostgreSQL

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

0グッド

0クリップ

投稿2020/08/01 06:14

#実現したいこと
ローカルのRailsアプリケーションを、herokuにpushして動作させる

#現状
ローカルのRailsアプリケーションを、herokuにpushしたのち、
heroku run rails db:migrateを実行すると、

PG::DatatypeMismatch: ERROR: column "date" cannot be cast automatically to type date

というエラーが発生する。
詳細を見ると、

20200630131512 ChangeDatatypeDateOfUsages: migrating ======================= -- change_column(:usages, :date, :date) D, [2020-08-01T05:47:39.087967 #4] DEBUG -- : (2.9ms) ALTER TABLE "usages" ALTER COLUMN "date" TYPE date D, [2020-08-01T05:47:39.088873 #4] DEBUG -- : (0.7ms) ROLLBACK

となっており、該当のマイグレーションファイルは、

class ChangeDatatypeDateOfUsages < ActiveRecord::Migration[5.2] def change change_column :usages, :date, :date end end

というもの。これは、当初、Usagesテーブルを作成する際、dateカラムをintegerでALTERしたものの、適切でないことに気付いて、date型に変更するマイグレーションファイルを追加した、という経緯。

この処理が、ローカル環境(sqlite3)ではうまくいっていたものの、Heroku(postgresql)ではうまくいっていない

#実施したこと
以下のように、columnをremoveしてaddするマイグレーションファイルを追加した

class RemoveDateFromUsages < ActiveRecord::Migration[5.2] def change remove_column :usages, :date, :date end end
class AddDateToUsages < ActiveRecord::Migration[5.2] def change add_column :usages, :date, :date end end

#実施したこと の結果

上記の2つのマイグレーションファイルは実行されずに処理が終了してしまいます。

heroku run rails db:migrate:status

database: ********

Status Migration ID Migration Name

D, [2020-08-01T06:00:19.270873 #4] DEBUG -- : (1.7ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
up 20200528125514 Devise create users
up 20200529143446 Add name to users
up 20200530103705 Create groups
up 20200530103854 Create group users
up 20200605144835 Create plans
up 20200613063958 Create usages
up 20200620101500 Add choices to plans
down 20200630131512 Change datatype date of usages //問題のマイグレーションファイル
down 20200801034216 Remove date from usages //実行されてほしいマイグレーションファイル
down 20200801034530 Add date to usages //実行されてほしいマイグレーションファイル
#聞きたいこと
ローカルでは既に実行済みのマイグレーションファイルを削除して、Herokuにpushすると、というのは
何らかのエラーの原因になりえますでしょうか。
具体的には、ChangeDatatypeDateOfUsagesマイグレーションファイルを削除したい(=実行されないようにしたい)です。

https://qiita.com/jnchito/items/3525fd22973477b88411

を見るに、やってはいけない行為のようですが、代替案が思い浮かばずにいます。

知見がお有りの方、どうぞ宜しくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

  1. githubに公開したとはいえ、まだ他人がつかってはいない
  2. local を20200620101500 にもどして構わない

のでしたら障害は出ないでしょう

手順
1, local を 20200620101500 に戻す

  1. 20200630131512 を git rm し、commitし、githubにpushする
  2. 20200801034216 20200801034216 を git add し commitし pushする

20200801034216 20200801034216がすでにadd,commit,push してあってもうまく行くと思います。

投稿2020/08/01 06:21

編集2020/08/01 06:25
winterboum

総合スコア23284

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

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

YO14

2020/08/01 06:50

ご回答ありがとうございます。 ご提示の、 githubに公開したとはいえ、まだ他人がつかってはいない →こちらは問題ありません local を20200620101500 にもどして構わない →こちらは、最新の作業ブランチとだいぶ差があるため厳しいです…。 最新の作業ブランチで、該当のマイグレーションファイルを物理的に削除して、それをgit add, git commit, heroku push するのはやはりダメなのでしょうか。
winterboum

2020/08/01 08:06

git のcommitを 20200620101500 にもどすのではなく、DBの状態を戻すだけです。 物理的に削除するだけではgithub上は残るので、やるなら git rm してcommitが必要です
YO14

2020/08/01 14:23 編集

ご回答ありがとうございます。 すみません、ブランチの状態を過去のcommitまで巻き戻す、と読み違えておりました。 git rm で該当のマイグレーションファイルを削除し、その変更をadd, commit, pushしてリポジトリに反映させる、ということですね。 ご提示いただいた手順ですが、「DBの状態を戻す」というのは、 20200630131512 をgit rm し、その情報と、 20200801034216 20200801034530 をadd, pushし、ローカルでrails db:migrateを実行する、ということで合っていますでしょうか。 そしてその上で、heroku run rails db:migrateを実行することで、 ローカルとHerokuで同一のマイグレーションファイルを読み込んでSQLが発行される、というイメージですが、認識は合っていますでしょうか。 ローカルのDBは、以下の状態ですが、rollbackを実行する必要はあるのでしょうか。 Status Migration ID Migration Name -------------------------------------------------- up 20200528125514 Devise create users up 20200529143446 Add name to users up 20200530103705 Create groups up 20200530103854 Create group users up 20200605144835 Create plans up 20200613063958 Create usages up 20200620101500 Add choices to plans up 20200630131512 Change datatype date of usages down 20200801034216 Remove date from usages down 20200801034530 Add date to usages
YO14

2020/08/01 14:40 編集

ローカルで、rollback で 20200630131512 Change datatype date of usages をdownにする git rm で上記ファイルを削除 rails db:migrate git add, commit push git push heroku master heroku run rails db:migrate という手順をイメージしています
winterboum

2020/08/01 19:44

たくさんもどすなら rails db:migrate VERSION=20200620101500 ひとつ戻すだけで良さそうですから rails db:rollback
YO14

2020/08/01 23:18

ご回答ありがとうございます。 rails db:rollback git rm で20200630131512 を削除 rails db:migrate git add, commit push git push heroku master heroku run rails db:migrate で合っていますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問