Получение "Неизвестный первичный ключ для таблицы", в то время как идентификатор

Я отлаживал эту проблему с треугольником Rails, предоставляя мне "Неизвестный первичный ключ для таблицы...", даже если там есть идентификатор таблицы.

Я скопировал базу данных из одного приложения heroku в другой, на исходном databse нет проблем, а новый дает мне ошибку 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)

Любая идея, почему это может случиться?

Спасибо!

Ответ 1

Кажется, что для коллекций таблиц отсутствует первичный ключ.

До 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

Ответ 2

У меня была аналогичная проблема, и это была единственная страница, которую я мог найти. Так что на всякий случай это поможет кому-то еще...

Я начал внезапно получать недостающие сообщения первичного ключа на пару таблиц. Я предполагаю, но не уверен, что это началось после нажатия данных (pg_dump local, heroku pg:restore)

Первичные ключи, о которых идет речь, были оба на таблицах, которые были переименованы, так что имя pkey не соответствовало имени таблицы, но, с другой стороны, многие другие переименованные таблицы находились в одной лодке и не имели проблем.

В любом случае, в какой-то момент в моем крушении я попытался загрузить другой файл дампа, и я заметил некоторые жалобы на оскорбительные индексы. Сначала он попытается удалить их и пожаловаться на то, что он не мог, потому что их не было. Позже он попытается создать их и пожаловаться на то, что он не мог, потому что они уже существовали.

Очень раздражает, учитывая, что информация pkey не отображается в schema.rb и должна "просто работать", правильно?

Во всяком случае, то, что сработало для меня (и, следовательно, причина, по которой я отправляю), - это сделать heroku pg:reset, а затем снова загрузить дамп. Боковое замечание, я получил "внутреннюю ошибку сервера" в первые два раза, я попробовал heroku pg:reset. Но позже я снова попытался, и это сработало.

Ответ 3

Недавно я столкнулся с этой ошибкой: "Неизвестный первичный ключ для таблицы" и, как и вопрос, появился после копирования базы данных в приложение Heroku.

Исходная база данных не имела ошибки, поэтому я был уверен, что таблица и первичный ключ были в порядке.

Я попробовал несколько советов на этой странице, в том числе начиная с нуля с heroku pg:reset, новой pg_dump старой базы данных и pgbackups:restore в новую базу данных, затем запуская миграции и посев... ничего не работало.

Что, наконец, решило мою проблему, было просто: перезапустить приложение. В новом приложении было много миграций баз данных, а запуск heroku restart перезагрузил схему и отобрал изменения схемы. На этой странице документации Heroku объясняется:

Запуск команд рейка

После запуска миграции вы хотите перезапустить приложение с перезапуском heroku, чтобы перезагрузить схему и перенести любые изменения схемы.

Ответ 4

Что помогло мне (произошло на heroku после восстановления db), переиндексация индекса первичного ключа:

reindex index $primary_key_index_name

Ответ 5

Я восстанавливал дамп базы данных из heroku в свою локальную систему и получал эту ошибку.

ActiveRecord::UnknownPrimaryKey: ActiveRecord::UnknownPrimaryKey

Я восстанавливал существующую базу данных, поэтому я удалил базу данных, создал новую базу данных, а затем восстановил дамп, и это сработало для меня.

Ответ 6

Если вы пытаетесь устранить эту проблему, обязательно проверьте свои журналы. Я заметил более раннюю ошибку, связанную с активностью js, которая не была предварительно скомпилирована. Это потерялось в стеке сообщений рендеринга.

Как только я исправил проблему предварительной компиляции активов, ошибка "Неизвестный первичный ключ для таблицы" больше не была выбрана.

Это было на 100%, безусловно, единственное, что я изменил.

Ответ 7

У меня была эта проблема, и проблема оказалась в том, что моя таблица каким-то образом фактически не имела индекса первичного ключа. Решением было создание миграции, в которой был добавлен первичный ключ:

execute "ALTER TABLE appointment_reminder_text ADD PRIMARY KEY (id)"

Ответ 8

Спасибо, изменив индекс выше, работал у меня. Еще одна краткая заметка о том, как эта ошибка проявится, если будет связано более сложное отношение:

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