web-dev-qa-db-ja.com

IDが存在するときに「テーブルの不明な主キー」を取得する

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)

なぜこれが起こる可能性がありますか?

ありがとう!

30
hakunin

テーブルコレクションの主キーが見つからないようです。

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

[〜#〜] or [〜#〜]

テーブルを変更し、idの主キーを次のように設定できます。

移行ファイルを作成して主キーを設定します

class AddPrimaryKeyToCollections < ActiveRecord::Migration
 def change
   execute "ALTER TABLE collections ADD PRIMARY KEY (id);"
 end
end
35
Debadatt

私は同様の問題を抱えていて、これが私が見つけることができた唯一のページでした。だから万が一の場合に備えて...

突然、いくつかのテーブルでプライマリキーメッセージが欠落し始めました。データをプッシュした後にこれが発生し始めたとは思いますが、わかりません(pg_dump local、heroku pg:restore

問題の主キーは両方ともpkey名がテーブル名と一致しないように名前が変更されたテーブル上にありましたが、他の多くの名前が変更されたテーブルは同じボートにあり、問題はありませんでした。

とにかく、あちこちで動揺していたある時点で、別のダンプファイルをアップロードしようとしましたが、問題のあるインデックスに関する苦情に気付きました。まず、それらを削除しようとし、それらが存在しなかったためにできないと文句を言います。後で、それらを作成しようとし、既に存在しているためできないという不満があります。

Pkey情報がschema.rbに表示されず、「正常に動作する」はずだと考えると、非常に迷惑ですよね?

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

15
elc

最近、「テーブルの不明な主キー」というエラーに遭遇しました。質問者のように、データベースをHerokuアプリにコピーした後に表示されました。 TL; DR:アプリを再起動してみてください。

私の場合、ソースデータベースにはエラーがなかったため、テーブルと主キーは問題ないと確信していました。

このページでいくつかの提案を試みました。heroku pg:reset、 新着 pg_dump古いデータベース、およびpgbackups:restore新しいデータベースに移行し、移行とシードを実行します...何も機能しませんでした。

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

Rakeコマンドの実行

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

8
Jake Worth

私にとって助けになったのは(dbの復元後にherokuで起こった)主キーインデックスの再インデックス付けです。

reindex index $primary_key_index_name

2
Michiel de Mare

データベースダンプをherokuからローカルシステムに復元していて、このエラーが発生していました。

ActiveRecord::UnknownPrimaryKey: ActiveRecord::UnknownPrimaryKey

既存のデータベースに復元していたので、データベースを削除し、新しいデータベースを作成してからダンプを復元しましたが、うまくいきました

2
rubyonrails3

herokuサーバーの再起動はうまくいきました。たぶん、db-restorement中に空のdb-schemaを認識していたのは、スプリングプリローダーでした。

1
loybert

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

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

私が変更したのは、これが間違いなく100%でした。

0
Undistraction

上記のインデックスを変更してくれてありがとう。より複雑な関係が含まれる場合、このエラーがどのように現れるかについての簡単なメモ:

ActiveRecord::StatementInvalid - PG::SyntaxError: ERROR:  zero-length delimited identifier at or near """"
LINE 1: ...CT "users".* FROM "users"  WHERE "benefits"."" IN ('1'...
0
Nathan Bertram

私はこの問題を抱えていましたが、問題は私のテーブルに何らかの理由で主キーインデックスがなかったことでした。解決策は、プライマリキーを追加した移行を作成することでした。

execute "ALTER TABLE appointment_reminder_text ADD PRIMARY KEY (id)"
0
Jason Swett