首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ID存在时获取“表的未知主键”

在ID存在时获取“表的未知主键”
EN

Stack Overflow用户
提问于 2013-08-05 10:39:11
回答 12查看 36.5K关注 0票数 45

我一直在调试这个奇怪的Rails问题,它给了我“表的未知主键.”,即使当表的ID在那里时也是如此。

我将数据库从一个heroku应用程序复制到另一个应用程序,在原始数据库上没有问题,新的数据库给了我一个db错误。

这是一个错误:

代码语言:javascript
运行
复制
ProductsController# (ActionView::Template::Error) "Unknown primary key for table collections in model Collection."

/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/reflection.rb:366:in `primary_key'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/reflection.rb:480:in `association_primary_key'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association_scope.rb:58:in `block in add_constraints'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association_scope.rb:39:in `each'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association_scope.rb:39:in `each_with_index'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association_scope.rb:39:in `add_constraints'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association_scope.rb:31:in `scope'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association.rb:98:in `association_scope'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association.rb:87:in `scoped'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/collection_association.rb:573:in `first_or_last'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/collection_association.rb:105:in `last'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/collection_proxy.rb:46:in `last'
/app/app/helpers/likes_helper.rb:62:in `significant_liker'

导致这一现象的原因是:

代码语言:javascript
运行
复制
product.collections.last.try :user

这张桌子:

代码语言:javascript
运行
复制
d8apjspa441pad=> \d collections
                                     Table "public.collections"
     Column     |          Type          |                        Modifiers                         
----------------+------------------------+----------------------------------------------------------
 id             | integer                | not null default nextval('collections_id_seq'::regclass)
 name           | character varying(255) | 
 user_id        | integer                | 
 permalink      | character varying(255) | 
 category_id    | integer                | 
 products_count | integer                | 
 is_featured    | boolean                | 
Indexes:
    "index_lists_on_user_id_and_permalink" UNIQUE, btree (user_id, permalink)

知道为什么会发生这种事吗?

谢谢!

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2013-08-05 12:31:10

表集合似乎缺少主键。

在Rails 3.2之前,在模型中设置主键,如

代码语言:javascript
运行
复制
class Collection < ActiveRecord::Base
  set_primary_key "my_existing_column"
end

In Rails 3.2+和Rails 4,在模型中设置主键,如

代码语言:javascript
运行
复制
class Collection < ActiveRecord::Base
  self.primary_key = "my_existing_column"
end

我们可以修改表并为id设置主键,例如

创建一个迁移文件来设置主键

代码语言:javascript
运行
复制
class AddPrimaryKeyToCollections < ActiveRecord::Migration
 def change
   execute "ALTER TABLE collections ADD PRIMARY KEY (id);"
 end
end
票数 46
EN

Stack Overflow用户

发布于 2013-08-14 21:47:28

我也有类似的问题,这是我唯一能找到的一页。所以万一对其他人有帮助..。

我突然在几张桌子上丢失了主键信息。我猜想,但不确定,这种情况是在推送数据(pg_dump local,heroku pg:restore)之后开始的。

所讨论的主键都位于已重命名的表上,因此pkey名称与表名不匹配--但另一方面,许多其他重命名的表处于同一条船上,没有问题。

无论如何,我曾经尝试上传另一个转储文件,并注意到一些关于违规索引的抱怨。首先,它将尝试删除它们,并抱怨说它不能,因为它们不存在。后来,它会尝试创建它们,并抱怨说它无法实现,因为它们已经存在了。

考虑到pkey信息没有出现在schema.rb中,而且应该是“只起作用”,这让人非常讨厌,对吧?

无论如何,对我起作用的(因此我张贴的原因)是做一个heroku pg:reset,然后再加载转储。附带注意,在我尝试heroku pg:reset的前两次,我得到了“内部服务器错误”。但后来我又试了一次成功了。

票数 17
EN

Stack Overflow用户

发布于 2014-07-16 04:11:25

TL;DR:尝试重新启动应用程序.

代码语言:javascript
运行
复制
heroku restart

我最近遇到了这样的错误:“表的未知主键”,就像问询器一样,它是在将数据库复制到Heroku应用程序之后出现的。

复制的数据库没有错误,所以我确信表和主键都很好。

我在这个页面上尝试了一些建议,包括从零开始使用heroku pg:reset、旧数据库的新pg_dump和进入新数据库的pgbackups:restore,然后运行迁移和播种.什么都没用。

最终解决我问题的是重新启动这个应用程序。新的应用程序有许多数据库迁移,重新启动应用程序重新加载模式并获取更改。这一页来自Heroku的文档,解释:

运行Rake命令

在运行迁移之后,您将希望使用heroku重新启动应用程序,重新加载模式并获取任何模式更改。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18056162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档