40

テーブルのIDがそこにある場合でも、「テーブルの不明な主キー...」というRailsのこの奇妙な問題をデバッグしています。

データベースをある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する」はずであることを考えると、非常に面倒ですよね?

とにかく、私のために働いたのは(そして私が投稿している理由)heroku pg:reset、ダンプを再度ロードすることです。ちなみに、最初の 2 回の試行で「内部サーバー エラー」が発生しましたheroku pg:reset。しかし、後でもう一度試したところ、うまくいきました。

于 2013-08-14T21:47:28.357 に答える
16

TL;DR: アプリを再起動してみてください。

heroku restart

最近、「テーブルの主キーが不明です」というエラーが発生しました。質問者と同様に、データベースを Heroku アプリにコピーした後に表示されました。

コピーしたデータベースにエラーはなかったので、テーブルと主キーは問題ないと確信しました。

私はこのページでいくつかの提案を試みました。たとえば、古いデータベースのheroku pg:reset新しいものから最初から始めて、新しいデータベースに移行し、移行とシードを実行しました...何も機能しませんでした。pg_dumppgbackups:restore

私の問題を最終的に解決したのは、アプリを再起動することでした。新しいアプリには多くのデータベースの移行があり、アプリを再起動するとスキーマが再読み込みされ、変更が反映されました。Heroku のドキュメントのこのページでは、次のように説明されています。

Rake コマンドの実行

移行を実行した後、heroku restart でアプリを再起動して、スキーマをリロードし、スキーマの変更をピックアップします。

于 2014-07-16T04:11:25.370 に答える
1

私はこの問題を抱えていましたが、問題は、私のテーブルに何らかの形で実際に主キー インデックスがないことが判明しました。解決策は、主キーを追加する移行を作成することでした。

execute "ALTER TABLE appointment_reminder_text ADD PRIMARY KEY (id)"
于 2015-08-10T13:50:05.890 に答える
0

この問題のトラブルシューティングを行う場合は、ログを注意深く確認してください。プリコンパイルされていない js アセットに関連する以前のエラーに気付きました。これは、レンダリング メッセージのスタックで失われました。

アセットのプリコンパイルの問題を修正すると、「テーブルの不明な主キー」エラーはスローされなくなりました。

これは間違いなく私が変更した唯一のものでした。

于 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 に答える