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

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

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

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

Ruby on Rails

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

Q&A

5回答

854閲覧

本番環境のNO FILEのマイグレーション履歴を消したい。

ryoryo3

総合スコア18

Heroku

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

Ruby on Rails

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

1グッド

1クリップ

投稿2019/06/14 05:57

前提・実現したいこと

heroku上のマイグレーション履歴のうち、「NO FILE」のところを消したい。
どなたかお教えいただけないでしょうか?

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

ActiveRecord::StatementInvalid: PG::DuplicateTable: ERROR: relation "category_books" already exists

NO FILEがupされているせいで、category_booksテーブルのマイグレーションができない状況です。

該当のソースコード

  up 20190330073144 Create users up 20190401014219 Create locations up 20190401014459 Add details to users up 20190401015637 Remove user detail from users up 20190401051317 Create questions up 20190401074656 Create relationships up 20190401080822 Create categories up 20190401081129 Create category questions up 20190401085312 Create comments up 20190401085851 Create question likes up 20190401090155 Create comment likes up 20190611045153 Create books up 20190611052533 ********** NO FILE ********** up 20190611052750 ********** NO FILE ********** down 20190613050731 Create bookcategories

試したこと

開発環境では、tmpファイルを作成して、そのファイルを削除することでNO FILEを削除できましたが、heroku上の本番環境でのNO FILEの消し方がわかりません。

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

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

DrqYuto👍を押しています

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

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

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

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

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

guest

回答5

0

良い子の状態からは大分ずれますが。。。。
まず、開発とサーバのDBの状態を合わせましょう。
両方で rake db:schema:dump してschema.rbをDBと同期させ、比較して下さい。
ああ、サーバではRAILS_ENV をproductionにするのを忘れないで。
違っている所を載せて下さい。

投稿2019/06/18 07:56

winterboum

総合スコア23284

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

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

ryoryo3

2019/06/18 11:04

すいません。「schema.rbをDBと同期させ」るとはどういうことを言うのでしょうか?
winterboum

2019/06/18 11:24

DBの内容と db/schema.rb の内容が違ってしまうことがあります。 ので、それを一致(==同期)させてから比較して下さいという意味です。 rake db:schema:dump で同期ができます
ryoryo3

2019/06/24 05:39 編集

遅くなってしまいました。 rails db:schema:dumpとheroku run rails db:schema:dump RAILS_ENV=productionを行いました。 何と何の違っているところをお見せすればよいでしょうか?
ryoryo3

2019/06/24 05:45

schema.rbと実際のマイグレーション 履歴の違っているところであれば、 create_table "category_books", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| t.integer "book_id" t.integer "bookcategory_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["book_id"], name: "index_category_books_on_book_id", using: :btree t.index ["bookcategory_id"], name: "index_category_books_on_bookcategory_id", using: :btree end となります。
winterboum

2019/06/24 09:21

rails db:schema:dumpとheroku run rails db:schema:dump の2つのschema.rbの違いを見せてください。 diff というUnix系のcommadが使えるなら diff -u file1 file2 > schema.diff で、 それができないなら、 editor でコツコツ同じ所を削除で、
ryoryo3

2019/06/24 09:52

ご回答ありがとうございます。 dbのディレクトリにschema.rbはあるのですが、もう一つのheroku上のschema.rbのファイルはどこにあるのでしょうか?
winterboum

2019/06/24 10:43

heroku上の RAILS_ROOT/db にあると思います。 herokuは使っていないので、どう手元に取り寄せるか、はわかりません。
guest

0

開発と本番がずれてしまったのですね、まぁよくあることです。
>Gitのcommitに戻ると、開発環境だけでなくherokuの本番環境のFILEも復活するのでしょうか?
>また、開発環境でNO FILEが解消しても、それをherokuの本番環境でも同じ状況にできるのでしょうか?

両方Noです。

一番簡単なのは、DBを作りなおすことです。データは全部消えてしまいますが。
db:reset だったかな。

でない場合、
本番のDBの状態をCreate books が終わったところまで戻しても大丈夫ですか?

up 20190611045153 Create books
up 20190611052533 ********** NO FILE **********
up 20190611052750 ********** NO FILE **********
down 20190613050731 Create bookcategories

まだリリース前だ、という予想で、大丈夫 としておきます

1)消えたmigrationが復活するcommit を checkout する
2)そのmigrationをよそに保存
3)今のmigrationに戻る
4)保存したmigrationををdb/migrationsにもどしてcommitする
5)githubにpushしてherokuを更新し、DBをCreate booksに戻す
raiks db:migrate VERSION=20190611045153

ここで復活した2つのmigrationが必要かどうか判断する。
消す場合は、git rm してcommit

で、この最新commitで開発、サーバで db:migrate する

投稿2019/06/17 21:41

winterboum

総合スコア23284

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

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

winterboum

2019/06/17 21:44

修正。 db:reset はdb/schema.rb を元に作りなおしていたかも。 その場合はNO FILE 復活してしまうかも。 その場合は db:drop ; db:create;db:migrate
ryoryo3

2019/06/18 07:22

ご回答ありがとうございます。 実はもうリリースしておりまして、データベースのデータが消えたり「本番のDBの状態をCreate books が終わったところまで戻」すのは困る状況なのです。 その場合は難しいでしょうか?
guest

0

問題は2つあります
(A)NO FILE があるため、今後のDBの管理に支障がでるかも
(B)category_books が既にあるため、それがじゃま

(A)NO FILE が起きるのは私の経験では2種あります。
(1)branch AからBをつくり、そこでmigrationを作成して本番にも適応
その後Aにmergeしないまま、本番をbranch A にした
(2)migration を作成し、本番にも適応したが、気が変わってmigrationを削除した

herokuということはGit管理していると思われます。その頃のcommitにもどれば消えたFILEが復活すると思います。それを取り込めばNO FILEは解消します。
その時点で、必要ならそのまま、不要ならそれを取り消すmigrationを書く。

(B) tableを手動で削除するには mysql とか psql とかでDBにLoginしてSQL語で会話が必要です。
herokuでそれができるのかわからないのと、SQLの素養をお持ちかもしくは今回持つつもりがあるか、、、、 分からないので、RAILSのみでやる、良い子がしては行けない方法を。
・category_books を drop_table するmigrationを書き、
・実行し、
・すぐ削除する
ただし、(A)の対応を先にして下さい。そこに多分 category_tableのことが書いてあります。

投稿2019/06/14 22:57

winterboum

総合スコア23284

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

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

ryoryo3

2019/06/17 14:36

丁寧なご回答ありがとうございます! ご回答の沿って考えてみました。 (A)に関してですが、branchは作成していなかったので、(1)ではなく(2)となります。 「その頃のcommitにもどれば消えたFILEが復活すると思います。それを取り込めばNO FILEは解消します。」とありますが、Gitのcommitに戻ると、開発環境だけでなくherokuの本番環境のFILEも復活するのでしょうか? また、開発環境でNO FILEが解消しても、それをherokuの本番環境でも同じ状況にできるのでしょうか? ちなみに、現在、開発環境のマイグレーション 履歴は、以下のようになっており、NOFILEがない状態です。 Status Migration ID Migration Name -------------------------------------------------- ---- 省略 ---  up 20190401074656 Create relationships up 20190401080822 Create categories up 20190401081129 Create category questions up 20190401085312 Create comments up 20190401085851 Create question likes up 20190401090155 Create comment likes up 20190611045153 Create books up 20190613050731 Create bookcategories up 20190614073433 Create mid category books --- 省略 ---
guest

0

NO FILEがupされているせいで、category_booksテーブルのマイグレーションができない状況です。

エラーの本質はNO FILEではなく、メッセージにある通り「category_books」がすでに存在する、ということではないでしょうか。

データベースを手動で書き換えて、マイグレーションが想定する状態と実際のデータベースの状態を合わせる必要があるかもしれません。

投稿2019/06/14 06:01

maisumakun

総合スコア145121

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

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

ryoryo3

2019/06/14 06:08 編集

データベースを手動で書き換えるとは具体的にどういうことでしょうか? マイグレーション はしないということでしょうか?
guest

0

schema.rbと実際のマイグレーション 履歴の違っているところであれば、

create_table "category_books", force: :cascade, options:
:
end

となります。

とありますが、これは 
・heroke上のデータで
・schema.rb の方がこのデータがあり、
・db/migrate に対応するmigrationがない

という意味ですね。
で、localのschema.rbにはこれがない。

###
というのが合っているなら、
herku上で
0) ActiveRecord::StatementInvalid: PG::DuplicateTable: ERROR: のエラーを起こしたmigrationを他のdirectoryにcopyしておく

  1. db/migrateに残したmigration の中身を削除して migrate する
class CreateCategoryBook < ActiveRecord::Migration def change # この def --- end の間を削除する end # ここも有ったら削除 end
  1. copyしていたmigrationを戻し db:rollback

 但し、
create_table "category_books" でない
2つのindex
name: "index_category_books_on_book_id",
name: "index_category_books_on_bookcategory_id"
の作成が無い
ときはここの手順の修正が必要
3) copyしていたmigrationを戻し db:migrateする

で行けるかと。
但し
*実行前にDBのバックアップを取っておくことをお忘れなく

投稿2019/06/24 18:43

winterboum

総合スコア23284

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問