40

我一直在调试 Rails 这个奇怪的问题,给我“表的未知主键......”,即使表的 ID 在那里。

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

这是错误:

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'

导致它的行:

product.collections.last.try :user

和表格:

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)

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

谢谢!

4

12 回答 12

43

似乎表集合缺少主键。

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

class Collection < ActiveRecord::Base
  set_primary_key "my_existing_column"
end

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

class Collection < ActiveRecord::Base
  self.primary_key = "my_existing_column"
end

或者

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

创建迁移文件设置主键

class AddPrimaryKeyToCollections < ActiveRecord::Migration
 def change
   execute "ALTER TABLE collections ADD PRIMARY KEY (id);"
 end
end
于 2013-08-05T12:31:10.143 回答
17

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

我突然开始在几个表上丢失主键消息。我猜,但不确定,这在推送数据后开始发生(pg_dump local,heroku pg:restore

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

无论如何,在我四处游荡的某个时刻,我尝试上传另一个转储文件,但我注意到一些关于违规索引的投诉。首先它会尝试删除它们并抱怨它不能,因为它们不存在。后来它会尝试创建它们并抱怨它不能,因为它们已经存在。

考虑到 pkey 信息没有出现schema.rb并且应该“正常工作”,这很烦人,对吧?

无论如何,对我有用的(以及我发布的原因)是做 aheroku pg:reset然后再次加载转储。旁注,我尝试的前两次出现“内部服务器错误” heroku pg:reset。但后来我又试了一次,它奏效了。

于 2013-08-14T21:47:28.357 回答
16

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

heroku restart

我最近遇到了这个错误:“Unknown primary key for table”,就像提问者一样,它是在将数据库复制到 Heroku 应用程序后出现的。

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

我在此页面上尝试了一些建议,包括从头开始使用旧数据库的heroku pg:reset新数据库,然后进入新数据库,然后运行迁移和播种......没有任何效果。pg_dumppgbackups:restore

最终解决我的问题的是重新启动应用程序。新应用程序有许多数据库迁移,重新启动应用程序会重新加载架构并获取更改。Heroku 文档中的这个页面解释了:

运行 Rake 命令

运行迁移后,您需要使用 heroku restart 重新启动您的应用程序以重新加载架构并获取任何架构更改。

于 2014-07-16T04:11:25.370 回答
3

我正在将数据库转储从 heroku 恢复到我的本地系统并收到此错误..

ActiveRecord::UnknownPrimaryKey: ActiveRecord::UnknownPrimaryKey

我正在恢复现有数据库,所以我删除了数据库,创建了新数据库,然后恢复了转储,它对我有用

于 2017-02-28T17:27:08.710 回答
2

对我有帮助(在数据库还原后发生在 heroku 上)是重新索引主键索引:

reindex index $primary_key_index_name

于 2015-04-15T18:48:32.830 回答
1

我遇到了这个问题,结果证明我的表实际上没有主键索引。解决方案是创建一个添加主键的迁移:

execute "ALTER TABLE appointment_reminder_text ADD PRIMARY KEY (id)"
于 2015-08-10T13:50:05.890 回答
1

重新启动 heroku 服务器对我有用。也许是在数据库恢复期间识别空数据库模式的弹簧预加载器

于 2018-09-24T10:08:20.103 回答
1

在将数据转储从 heroku 导入本地时,我也会发生同样的事情。我有该应用程序的 Rails 5.1.6。添加self.primary_key = "id"到所有显示问题的模型后,一切对我来说都很好。

于 2020-06-07T19:48:21.803 回答
0

如果您尝试解决此问题,请确保仔细检查您的日志。我注意到一个与未预编译的 js 资产相关的早期错误。这在渲染消息堆栈中丢失了。

修复资产预编译问题后,不再抛出“表的未知主键”错误。

这绝对是我唯一改变的 100%。

于 2014-03-07T21:29:39.767 回答
0

感谢更改上面的索引对我有用。如果涉及更复杂的关系,关于此错误将如何表现出来的另一个快速说明:

ActiveRecord::StatementInvalid - PG::SyntaxError: ERROR:  zero-length delimited identifier at or near """"
LINE 1: ...CT "users".* FROM "users"  WHERE "benefits"."" IN ('1'...
于 2016-04-28T06:40:10.283 回答
0

我在 RSPEC 中进行测试时遇到了这个错误。

就我而言,我通过在我的 Rails 模型中添加/设置 primary_key 解决了这个问题

class Tablename < ApplicationRecord
   self.primary_key ="id" if Rails.env.test? #optional condition
   ......
end
于 2020-04-29T02:22:55.133 回答
0

您应该在目标应用程序上重新加载架构。然后加载数据库。

于 2020-08-04T07:37:24.080 回答