简而言之,在本地Postgres实例上删除,创建和运行迁移将为我的应用创建一个工作数据库任意次数,但Heroku的产品上的相同技术总是产生:
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 pg:psql
然后\dt
确认Heroku的数据库在迁移之前是空白的,以验证是否存在0个表。heroku pg:reset DATABASE
db/migrate
中的“mytable”迁移文件,以获得最早的时间戳,以便先运行这是一个非常简单的应用程序,所以非常令人沮丧的是,从头开始创建数据库这样的基本操作仍然会失败。有什么想法吗?
“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?
答案 0 :(得分:1)
这在某种程度上是由Rails控制器中的类变量引起的,该控制器引用了&#34; mytable&#34;类。基本上就是这样:
class HomeController < ApplicationController
@@data = {MyTable.new(...
在控制器方法中移动它并使其成为非类变量可以解决问题(我没有确定它是类var变量方面还是位于类def之下的位置)。
我仍然不明白为什么控制器代码是数据库迁移的一个因素。我有兴趣听听这是我做错了什么,还是耙子,铁轨或其他什么的错误。只发生在Heroku制作中,Rails 4.0.0