生产失败/ heroku:WHERE a.attrelid ='“学校”':: regclass

时间:2012-01-09 06:43:19

标签: ruby-on-rails ruby-on-rails-3 postgresql heroku

我在我的本地env中添加了一个名为schools的表,它在dev中工作正常。实际上它甚至可以在staging(heroku)中正常工作,但是在生产中失败了很多,而rake db:migrate会抛出错误。

我甚至无法预编译assest(使用RAILS_ENV = production),访问我的应用程序的任何部分,包括生产中的rails控制台(heroku)。一切都在抛出错误。我已经失去了几个小时,但我觉得没有更接近我们的想法。 (注意:我对table_name的引用有'"..."',我认为这是问题的一部分)

我从rails 3.1.0转到3.1.3,这可能与它有关。

PGError: ERROR:  relation "schools" does not exist

LINE 4:              WHERE a.attrelid = '"schools"'::regclass
                                        ^
:             SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
              FROM pg_attribute a LEFT JOIN pg_attrdef d
                ON a.attrelid = d.adrelid AND a.attnum = d.adnum
             WHERE a.attrelid = '"schools"'::regclass
               AND a.attnum > 0 AND NOT a.attisdropped
             ORDER BY a.attnum

我对此感到迷茫。我在这里阅读了关于这个主题的其他几个问题,但没有解决方案。谢谢您的帮助。 非常感谢任何见解。

更新 --------------------------------------- ---------------

我刚刚在heroku上创建了一个全新的应用程序并运行rake db:migrate并得到了同样的错误。

更新2

我从heroku克隆了应用程序,“学校”在模式中。

create_table "schools", :force => true do |t|
  ...
  ...
end

更新3

尝试恢复到rails 3.1.0,但这没有帮助。

更新4

仍然在努力。还没有收到heroku的支持。

更新5

Heroku支持能够检查“学校”不是数据库中的表格,但我仍然无法访问控制台和应用程序。

4 个答案:

答案 0 :(得分:5)

Heroku支持帮助我解决了这个问题,尽管我们发现它不一定是heroku的平台相关问题。

我遇到了鸡与鸡蛋问题,迁移无法运行,因为rails bootstrap正在尝试与表进行通信,并且由于迁移无法运行而未创建表。当rails引导时,ActiveAdmin正在初始化,并试图查找学校。谢谢大家的帮助。

答案 1 :(得分:5)

我通过评论

解决了这个问题
#ActiveAdmin.routes(self)
迁移前的路径中的

。完成迁移后,我只是取消注释这一行,一切正常。

答案 2 :(得分:1)

不,引用应该不是问题。虽然在这种情况下不需要双引号,但它们也没有错:

SELECT '"schools"'::regclass

我认为PostgreSQL是正确的,关系schools不存在 - 在您的数据库和作为search_path的一部分的架构中。

如果您可以连接到数据库,则可以运行此查询来诊断问题:

SELECT n.nspname AS schema_name
      ,c.relname AS table_name
      ,c.relhastriggers
      ,c.reltuples
FROM   pg_catalog.pg_class c
LEFT   JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE  c.relname ~~* '%schools%'
AND    c.relkind = 'r'
AND    nspname <> 'pg_catalog';

查找名称中包含字符串schools的每个表。与psql元命令类似:

\dt *schools*

确保您与同一用户连接到遇到问题的同一数据库。

答案 3 :(得分:0)

我在运行测试时遇到过这个问题。

只需重置test环境的数据库:

rake db:reset RAILS_ENV=test