つまり、ローカル 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
、次に\dt
0テーブルが存在することを確認しました。 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 中にコントローラ コードがどのようにスコープに入るのですか?