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!
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
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é.
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.
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
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
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
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é.
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'...
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)"