PG:Error关系不存在。

6
我正在使用Rails 3.2.x,并且也在使用RailsAdmin。
我运行了许多迁移并多次更改了我的数据库结构。由此导致的问题是,我收到了PG:Error错误,该错误表示表不存在于关系中,但实际上该表确实不存在。
这是错误信息:
ActiveRecord::StatementInvalid at /
PG::Error: ERROR:  relation "addresses" does not exist
LINE 5:              WHERE a.attrelid = '"addresses"'::regclass
                                        ^
:             SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod

简而言之,当我访问/admin时,在我的development.log文件中显示的错误如下:

Started GET "/admin" for 127.0.0.1 at 2013-07-04 02:24:07 -0500
Processing by RailsAdmin::MainController#dashboard as HTML
  Cart Load (0.5ms)  SELECT "carts".* FROM "carts" WHERE "carts"."id" = $1 LIMIT 1  [["id", 5]]
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
   (0.6ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = 1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))
   (0.6ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = 1 AND (((roles.name = 'seller') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))
PG::Error: ERROR:  relation "addresses" does not exist
LINE 5:              WHERE a.attrelid = '"addresses"'::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 = '"addresses"'::regclass
               AND a.attnum > 0 AND NOT a.attisdropped
             ORDER BY a.attnum

Completed 500 Internal Server Error in 1269ms

ActiveRecord::StatementInvalid - PG::Error: ERROR:  relation "addresses" does not exist
LINE 5:              WHERE a.attrelid = '"addresses"'::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 = '"addresses"'::regclass
               AND a.attnum > 0 AND NOT a.attisdropped
             ORDER BY a.attnum

我该怎么解决这个问题?


这是在生产环境中吗? - Mike Szyndel
这是在开发中,但也可能在生产环境中发生。 - marcamillion
问题是addresses表缺失,但我无法确定原因是什么。就像你所说的,迁移出现了混乱。 - Mike Szyndel
2个回答

3

我的建议是删除并重新创建整个数据库。在执行此操作时,您可能会遇到一些迁移问题 - 请修复所有这些问题,以便可以进行应用程序的干净安装。


这太冒险了,因为我使用了一些宝石和Rails引擎,它们没有适当的迁移来摆脱它 - 这只是一团糟。所以我知道这个解决方案是一个短期解决方案,但在将来的某个时候,我会从头开始重新编写它。但现在,我该如何解决这个问题? - marcamillion
不要随意操作数据库?不开玩笑。你有一些宝石没有提供迁移吗? - Mike Szyndel
我安装了piggybak - 虽然它有一个用于up-migrations的生成器,但在使用一段时间后卸载这个gem,并在安装后运行/生成其他迁移后,会很麻烦。所以...我手动删除了与piggybak相关的表,现在一切都乱了。 - marcamillion
哦...为了让事情更复杂,我已经在开发环境和 Heroku 上安装了它。因此,我不能简单地从 Gemfile 中删除 gem,我必须做一些有意义的事情。问题在于,对于每个新的应用程序安装,我仍然拥有旧的 piggybak 和所有其他 gems 的 create migrations。所以这是一个巨大的混乱。 - marcamillion
你可以在删除数据库之前存储种子数据,然后当你重新创建数据库结构时,可以重新填充存储的数据。 - Малъ Скрылевъ

0

尽管表不存在,但模型存在。Rails admin 期望每个继承自 active record 的模型都有一个对应的表。如果你有一个没有数据库表支持的模型,那么不要使用 < ActiveRecord::Base,只需声明该类即可,Rails_admin 就会很高兴。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接