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)
なぜこれが起こる可能性がありますか?
ありがとう!
テーブルコレクションの主キーが見つからないようです。
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
私は同様の問題を抱えていて、これが私が見つけることができた唯一のページでした。だから万が一の場合に備えて...
突然、いくつかのテーブルでプライマリキーメッセージが欠落し始めました。データをプッシュした後にこれが発生し始めたとは思いますが、わかりません(pg_dump local、heroku pg:restore
)
問題の主キーは両方ともpkey名がテーブル名と一致しないように名前が変更されたテーブル上にありましたが、他の多くの名前が変更されたテーブルは同じボートにあり、問題はありませんでした。
とにかく、あちこちで動揺していたある時点で、別のダンプファイルをアップロードしようとしましたが、問題のあるインデックスに関する苦情に気付きました。まず、それらを削除しようとし、それらが存在しなかったためにできないと文句を言います。後で、それらを作成しようとし、既に存在しているためできないという不満があります。
Pkey情報がschema.rb
に表示されず、「正常に動作する」はずだと考えると、非常に迷惑ですよね?
とにかく、私のために働いたのは(したがって、私が投稿している理由は)heroku pg:reset
を実行してから、ダンプを再度ロードすることです。サイドノート、heroku pg:reset
を試した最初の2回で「内部サーバーエラー」が発生しました。しかし、後でもう一度試したところ、うまくいきました。
最近、「テーブルの不明な主キー」というエラーに遭遇しました。質問者のように、データベースをHerokuアプリにコピーした後に表示されました。 TL; DR:アプリを再起動してみてください。
私の場合、ソースデータベースにはエラーがなかったため、テーブルと主キーは問題ないと確信していました。
このページでいくつかの提案を試みました。heroku pg:reset
、 新着 pg_dump
古いデータベース、およびpgbackups:restore
新しいデータベースに移行し、移行とシードを実行します...何も機能しませんでした。
最終的に私の問題を解決したのは、アプリを再起動することです。新しいアプリには多くのデータベースの移行があり、heroku restart
はスキーマを再ロードし、スキーマの変更を取得しました。 Herokuのドキュメントのこのページでは、次のことを説明しています。
移行を実行した後、heroku restartでアプリを再起動して、スキーマをリロードし、スキーマの変更を取得します。
私にとって助けになったのは(dbの復元後にherokuで起こった)主キーインデックスの再インデックス付けです。
reindex index $primary_key_index_name
データベースダンプをherokuからローカルシステムに復元していて、このエラーが発生していました。
ActiveRecord::UnknownPrimaryKey: ActiveRecord::UnknownPrimaryKey
既存のデータベースに復元していたので、データベースを削除し、新しいデータベースを作成してからダンプを復元しましたが、うまくいきました
herokuサーバーの再起動はうまくいきました。たぶん、db-restorement中に空のdb-schemaを認識していたのは、スプリングプリローダーでした。
この問題のトラブルシューティングを行う場合は、ログを慎重に確認してください。プリコンパイルされていないjsアセットに関連する以前のエラーに気付きました。これは、レンダリングメッセージのスタックで失われました。
アセットのプリコンパイルの問題を修正すると、「テーブルの不明な主キー」エラーはスローされなくなりました。
私が変更したのは、これが間違いなく100%でした。
上記のインデックスを変更してくれてありがとう。より複雑な関係が含まれる場合、このエラーがどのように現れるかについての簡単なメモ:
ActiveRecord::StatementInvalid - PG::SyntaxError: ERROR: zero-length delimited identifier at or near """"
LINE 1: ...CT "users".* FROM "users" WHERE "benefits"."" IN ('1'...
私はこの問題を抱えていましたが、問題は私のテーブルに何らかの理由で主キーインデックスがなかったことでした。解決策は、プライマリキーを追加した移行を作成することでした。
execute "ALTER TABLE appointment_reminder_text ADD PRIMARY KEY (id)"