【发布时间】:2013-09-11 19:06:15
【问题描述】:
简而言之,在本地 Postgres 实例上删除、创建和运行 migrate 可以多次为我的应用程序创建工作数据库,但 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 - 确认本地和生产 Postgres 是 9.2.4 版
- 尝试将
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 期间控制器代码是如何进入范围的?
【问题讨论】:
-
您能否发布此迁移以及包含“mytable”的迁移?
-
添加了“mytable”迁移,但出现错误时不知道如何确定其他迁移正在运行。
-
我实际上不确定...我会尝试此处列出的一些方法(包括完全删除您的应用程序)。 stackoverflow.com/questions/5450930/…
-
您可以使用 --trace 运行迁移吗?这应该会为您提供失败时正在运行的迁移。
-
现在说得通了,谢谢 :) 我刚刚发现这与迁移期间加载的控制器代码有关。您可能会遇到相同的错误,github.com/activescaffold/active_scaffold/issues/131。快速测试是将 config.cache_classes = false 添加到 production.rb。
标签: ruby-on-rails postgresql heroku ruby-on-rails-4