27

Ho eseguito il debug di questo problema di trange di Rails assegnandomi "Chiave primaria sconosciuta per tabella ...", anche quando l'ID della tabella è presente.Ottenere "Chiave primaria sconosciuta per tabella" mentre l'ID è presente

Ho copiato il database da un'app di heroku a un altro, sul databse originale non ci sono problemi e il nuovo mi dà un errore db.

Questo è l'errore:

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 linea che lo causa:

product.collections.last.try :user 

e la tabella:

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) 

Qualsiasi idea del perché questo potrebbe accadere?

Grazie!

+0

Sembra che l'indice della chiave primaria manchi dalle raccolte. – Debadatt

+0

Puoi condividere per il mio e altri vantaggi come stabilirlo in una risposta? – hakunin

risposta

25

Sembra mancare la chiave primaria per le raccolte di tabelle.

Prima Rails 3.2, impostare la chiave primaria nel modello come

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

In Rails 3.2 + e rotaie 4, impostare la chiave primaria nel modello come

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

OR

Possiamo modificare il tavolo e d Impostare la chiave primaria per id come

Creare un file di migrazione per impostare la chiave primaria

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

Hmm, pensavo volessi impostare la chiave primaria in DB, questo è quello che ho fatto e sebbene si sia lamentato del fatto che la chiave sia già impostata, l'app ha iniziato a funzionare. Puoi spiegare perché userei 'set_primary_key' anche se l'ID è solo l'id di default? Potrebbe tornare utile. – hakunin

+0

Probabilmente la tabella delle collezioni manca un indice di chiave primaria in db. Ogni tabella dovrebbe avere una chiave primaria. Poiché la tabella qui perde la chiave primaria, dobbiamo configurarla. Ma l'ID predefinito non può essere impostato come chiave primaria ..quindi solleva un'eccezione. – Debadatt

+0

Quindi, basicamente, avevo due opzioni: dire esplicitamente a Rails o impostare correttamente l'attributo DB, giusto? Se aggiungi PSQL per configurare l'attributo, accetterò la tua risposta. – hakunin

13

stavo avendo un problema simile e questo era l'unica pagina che ho trovato. Quindi, nel caso in cui sarà di aiuto a chiunque altro ...

Ho iniziato improvvisamente a perdere i messaggi chiave primaria su un paio di tavoli. Sto indovinando, ma non sono sicuro, che questo ha avuto inizio dopo aver spinto i dati (pg_dump local, heroku pg:restore)

Le chiavi primarie in questione erano entrambe su tabelle che erano state rinominate in modo che il nome pkey non corrispondesse al nome della tabella - ma d'altra parte molti altri tavoli ribattezzati erano nella stessa barca e non avevano problemi.

Ad ogni modo, ad un certo punto del mio agitarsi ho provato a caricare un altro file di dump e ho notato alcuni reclami sugli indici incriminati. Prima cercherebbe di eliminarli e si lamenterebbe che non poteva perché non esistevano. Più tardi avrebbe cercato di crearli e si lamentava che non poteva perché erano già esistiti.

Molto fastidioso considerando che le informazioni pkey non vengono visualizzate in schema.rb e si suppone che "funzionino correttamente", giusto?

In ogni caso, ciò che ha funzionato per me (e quindi il motivo per cui sto postando) è di fare un heroku pg:reset e quindi caricare di nuovo il dump. Nota a margine, ho ricevuto "errore interno del server" le prime due volte che ho provato con heroku pg:reset. Ma più tardi ho provato di nuovo e ha funzionato.

0

Se si sta tentando di risolvere questo problema, verificare attentamente i registri. Ho notato un errore precedente relativo a un asset js che non era stato precompilato. Questo si è perso nella pila di messaggi di rendering.

Una volta risolto il problema della precompilazione delle risorse, l'errore "Chiave primaria sconosciuta per tabella" non veniva più generato.

Questo è stato sicuramente il 100% l'unica cosa che ho cambiato.

5

Mi è stato recentemente riscontrato questo errore: "Chiave primaria sconosciuta per tabella", e come il richiedente domanda, è apparso dopo aver copiato un database in un'app di Heroku.

Il database di origine non ha avuto errori, quindi ero fiducioso che la tabella e la chiave primaria andassero bene.

ho provato un paio di consigli su questa pagina tra cui partendo da zero con un heroku pg:reset, nuova pg_dump del vecchio database e pgbackups:restore nel nuovo database, quindi eseguire migrazioni e semina ... niente ha funzionato.

Ciò che finalmente ha risolto il mio problema era semplice: riavviare l'app. La nuova app ha avuto molte migrazioni di database e l'esecuzione di heroku restart ha ricaricato lo schema e rilevato le modifiche allo schema. Questa pagina dalla documentazione di Heroku spiega:

Running Rake Commands

Dopo aver eseguito una migrazione ti consigliamo di riavviare l'app con Heroku riavviare per ricaricare lo schema e di prelievo eventuali modifiche allo schema.

+1

Il riavvio semplice ha funzionato anche con me con questo errore dopo una distribuzione capistrano. – GSP

+0

'heroku pg: reset', quindi reimportare il DB ha funzionato per me. Avevo creato manualmente un indice sul DB di produzione e non veniva copiato correttamente sul DB di gestione temporanea – Josh

2

Quello che ha aiutato per me (è accaduto su Heroku dopo il ripristino di un db) è reindicizzazione l'indice chiave primaria:

reindex index $primary_key_index_name

+0

Dove si digita questo? – Swards

+0

Nella console 'psql'. –

+0

Stavo ricevendo l'errore in produzione (su Heroku) dopo una spinta. Non sono sicuro di avere accesso alla console db. Spingere di nuovo a Heroku sembrava risolverlo. Grazie per avermi indicato nella giusta direzione. – Swards

0

ho avuto questo problema e la questione si è rivelata che il mio tavolo in qualche modo in realtà non aveva un indice chiave primaria. La soluzione era quella di creare una migrazione che aggiungesse una chiave primaria:

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

Grazie per aver cambiato l'indice sopra indicato per me. Solo un altro breve nota su come questo errore si manifesterà se c'è un rapporto più complesso coinvolti:

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

stavo ristabilendo dump del database da Heroku al mio sistema locale ed è stato sempre questo errore ..

ActiveRecord::UnknownPrimaryKey: ActiveRecord::UnknownPrimaryKey 

Stavo ripristinando il database esistente, quindi ho abbandonato il database, creato un nuovo database e ripristinato il dump e ha funzionato per me