1

つまり、ローカル Postgres インスタンスでの移行のドロップ、作成、および実行は、私のアプリ用の作業データベースを作成するために何度でも機能しますが、Heroku の prod で同じ手法を使用すると、常に以下が生成されます。

heroku run rake db:migrate
Running `rake db:migrate` attached to terminal... up, run.9674
PG::UndefinedTable: ERROR:  relation "mytable" does not exist
LINE 5:                WHERE a.attrelid = '"mytable"'::regclass
                                          ^
:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                FROM pg_attribute a LEFT JOIN pg_attrdef d
                  ON a.attrelid = d.adrelid AND a.attnum = d.adnum
               WHERE a.attrelid = '"mytable"'::regclass
                 AND a.attnum > 0 AND NOT a.attisdropped
               ORDER BY a.attnum

rake aborted!
PG::UndefinedTable: ERROR:  relation "mytable" does not exist
LINE 5:                WHERE a.attrelid = '"mytable"'::regclass
                                          ^
:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                FROM pg_attribute a LEFT JOIN pg_attrdef d
                  ON a.attrelid = d.adrelid AND a.attnum = d.adnum
               WHERE a.attrelid = '"mytable"'::regclass
                 AND a.attnum > 0 AND NOT a.attisdropped
               ORDER BY a.attnum

編集:移行中にコントローラーがアクセスされる手がかりについては、質問の下部を参照してください。

これはローカルで機能するものです:

rake db:drop
rake db:create
rake db:migrate

私は持っている

  • 移行前にHerokuのデータベースが空白であることを確認しheroku pg:psql、次に\dt0テーブルが存在することを確認しました。
  • heroku pg:reset DATABASE移行前に試した
  • ローカルと本番両方の Postgres がバージョン 9.2.4 であることを確認
  • 最初に実行されるように、「mytable」移行ファイルの名前db/migrateを最も古いタイムスタンプを持つように変更しようとしました

これは非常に単純なアプリなので、最初からデータベースを作成するような基本的なことが失敗し続けるのは非常にイライラします. 何か案は?

「mytable」移行:

class CreateMytable < ActiveRecord::Migration
  def change
    create_table :mytable do |t|
      t.string :codes
      t.string :name

      t.timestamps
    end
  end
end

移行を参照している可能性があります:

class CreateTable2 < ActiveRecord::Migration
  def change
    create_table :table2 do |t|
      t.references :a, index: true
      t.references :b, index: true
      t.string :c
      t.string :d

      t.timestamps
    end
  end
end

編集: --trace を指定して db:migrate を実行すると、手がかりに気づきました。エラーの下のスタック トレースの上部には、コントローラー エラーが表示されますか?? 管理者が移行に関与するのはなぜですか?

/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:768:in `exec'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:768:in `exec_no_cache'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:138:in `block in exec_query'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:425:in `block in log'
/app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:420:in `log'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:137:in `exec_query'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:915:in `column_definitions'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/postgresql/schema_statements.rb:174:in `columns'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/schema_cache.rb:114:in `block in prepare_default_proc'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/schema_cache.rb:56:in `yield'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/schema_cache.rb:56:in `columns'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/model_schema.rb:208:in `columns'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/model_schema.rb:242:in `column_defaults'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/locking/optimistic.rb:169:in `column_defaults'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/core.rb:181:in `initialize'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/inheritance.rb:27:in `new'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/inheritance.rb:27:in `new'
/app/app/controllers/home_controller.rb:7:in `<class:HomeController>'

問題の 7 行目には への呼び出しが含まれていますMytable.new(...。db:migrate 中にコントローラ コードがどのようにスコープに入るのですか?

4

1 に答える 1

1

これは、「mytable」クラスを参照する Rails コントローラーでクラス変数を設定したことが原因でした。だから基本的にこれ:

 class HomeController < ApplicationController
  @@data = {MyTable.new(...

これをコントローラーメソッド内に移動して非クラス変数にすることで問題が修正されました(原因がクラスvarアスペクトなのか、クラスdefのすぐ下の場所なのかを特定しませんでした)。

コントローラーコードが db 移行の要因であった理由はまだわかりません。これが私が間違っていたのか、それともレーキ、レール、またはその他のバグなのかを知りたいです。Heroku プロダクション、Rails 4.0.0 でのみ発生

于 2013-09-08T01:59:28.110 に答える