web-dev-qa-db-fra.com

Obtention d'une "clé primaire inconnue pour la table" lorsque l'ID est là

J'ai débogué cet étrange problème de Rails me donnant "Clé primaire inconnue pour la table ...", même lorsque l'ID de la table est là.

J'ai copié la base de données d'une application Heroku à une autre, sur la base de données d'origine, il n'y a pas de problème et la nouvelle me donne une erreur db.

Voici l'erreur:

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'

La ligne qui le provoque:

product.collections.last.try :user

et le tableau:

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)

Une idée pourquoi cela pourrait arriver?

Merci!

30
hakunin

Il semble que la clé primaire soit manquante pour les collections de tables.

Avant Rails 3.2, définissez la clé primaire dans le modèle comme

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

Dans Rails 3.2+ et Rails 4, définissez la clé primaire dans le modèle comme

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

OU

Nous pouvons modifier la table et définir la clé primaire pour id comme

Créez un fichier de migration pour définir la clé primaire

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

J'avais un problème similaire et c'était la seule page que je pouvais trouver. Alors juste au cas où ça aiderait quelqu'un d'autre ...

J'ai soudainement commencé à manquer des messages de clé primaire sur quelques tables. Je suppose, mais je ne suis pas sûr, que cela a commencé à se produire après avoir poussé les données (pg_dump local, heroku pg:restore)

Les clés primaires en question se trouvaient toutes deux sur des tables qui avaient été renommées de sorte que le nom de la clé p ne correspondait pas au nom de la table - mais d'un autre côté, beaucoup d'autres tables renommées se trouvaient dans le même bateau et n'avaient pas de problèmes.

Quoi qu'il en soit, à un moment donné, j'ai essayé de télécharger un autre fichier de vidage et j'ai remarqué des plaintes sur les indices incriminés. D'abord, il essaierait de les supprimer et se plaindrait que cela ne pouvait pas parce qu'ils n'existaient pas. Plus tard, il essaierait de les créer et se plaindrait que cela ne pouvait pas parce qu'ils existaient déjà.

Très ennuyeux étant donné que les informations pkey n'apparaissent pas dans schema.rb et est censé "simplement fonctionner", non?

Quoi qu'il en soit, ce qui a fonctionné pour moi (et donc la raison pour laquelle je poste) est de faire un heroku pg:reset puis chargez à nouveau le vidage. Note latérale, j'ai eu une "erreur de serveur interne" les deux premières fois que j'ai essayé heroku pg:reset. Mais plus tard, j'ai réessayé et cela a fonctionné.

15
elc

J'ai récemment rencontré cette erreur: "Clé primaire inconnue pour la table", et comme le poseur de questions, elle est apparue après la copie d'une base de données dans une application Heroku. TL; DR: essayez de redémarrer l'application.

Dans mon cas, la base de données source ne contenait aucune erreur, j'étais donc convaincu que la table et la clé primaire étaient correctes.

J'ai essayé quelques suggestions sur cette page, notamment en partant de zéro avec un heroku pg:reset, Nouveau pg_dump de l'ancienne base de données et pgbackups:restore dans la nouvelle base de données, puis exécution des migrations et de l'amorçage ... rien n'a fonctionné.

Ce qui a finalement résolu mon problème: redémarrer l'application. La nouvelle application a connu de nombreuses migrations de base de données et a exécuté heroku restart a rechargé le schéma et pris les modifications de schéma. Cette page de la documentation de Heroku explique:

Exécution des commandes de râtea

Après avoir exécuté une migration, vous souhaiterez redémarrer votre application avec heroku restart pour recharger le schéma et récupérer les modifications de schéma.

8
Jake Worth

Ce qui m'a aidé (sur Heroku après une restauration db) est la réindexation de l'index de clé primaire:

reindex index $primary_key_index_name

2
Michiel de Mare

Je restaurais le vidage de la base de données de heroku sur mon système local et obtenais cette erreur ..

ActiveRecord::UnknownPrimaryKey: ActiveRecord::UnknownPrimaryKey

Je restaurais sur une base de données existante, j'ai donc supprimé la base de données, créé une nouvelle base de données, puis restauré le vidage et cela a fonctionné pour moi

2
rubyonrails3

redémarrer le serveur heroku a fonctionné pour moi. Peut-être que c'était le préchargeur de printemps qui reconnaissait le schéma db vide, pendant la restauration db

1
loybert

Si vous essayez de résoudre ce problème, vérifiez soigneusement vos journaux. J'ai remarqué une erreur antérieure liée à un élément js qui n'était pas précompilé. Cela s'est perdu dans la pile de rendu des messages.

Une fois que j'ai résolu le problème de précompilation de l'actif, l'erreur "Clé primaire inconnue pour la table" n'était plus levée.

C'était à 100% la seule chose que j'ai changé.

0
Undistraction

Merci de changer l'indice ci-dessus a fonctionné pour moi. Juste une autre note rapide sur la façon dont cette erreur se manifestera si une relation plus complexe est impliquée:

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

J'avais ce problème et le problème s'est avéré que ma table n'avait en fait pas d'index de clé primaire. La solution a été de créer une migration qui a ajouté une clé primaire:

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