2015-01-26 13 views
5

Questo è stato chiesto più volte prima (here e here e altro).Rails su heroku: dopo push, ottieni "PG :: UniqueViolation: ERRORE: valore chiave duplicato viola un vincolo univoco"

Ogni volta che spingo i miei rotaie app per Heroku (almeno per gli ultimi mesi, direi), devo resettare le mie chiavi utilizzando l'incantesimo familiare

ActiveRecord::Base.connection.tables.each { |t| ActiveRecord::Base.connection.reset_pk_sequence!(t) } 

. In caso contrario, ricevo errori di PostgreSQL come questo quando cerco di creare nuovi record:

(Questo è un esempio, accade su vari tavoli, a seconda di ciò che la prima azione è che è fatto su App dopo una spinta.

Una volta eseguita l'incantazione dei tasti di reset, è possibile fino alla mia prossima spinta su heroku ... anche quando il mio push non include alcuna migrazione.

Sono un po 'sconcertato sul perché questo sta accadendo e su cosa si può fare per impedirlo.

No, non esiste un codice di manipolazione datatable nelle attività di distribuzione.

+0

Mi chiedo se abbia qualcosa a che fare con il fatto che si tratta di un tavolo di join HABTM? – Beartech

+0

Ho aggiornato la domanda per provare a rendere più chiaro che non si verifica solo su questa tabella; quello era un esempio Sono abbastanza sicuro che sia successo anche sui tavoli non intersezioni, ma guarderò più da vicino la prossima volta che succede. – denishaskin

+0

L'unica cosa che posso pensare per aiutare a diagnosticare è guardare i registri di Heroku nello stesso momento in cui si preme l'aggiornamento fino a quando non si ottiene l'errore. Fai un 'heroku logs --tail' in un'altra finestra prima del push e guardalo dal vivo. Confrontalo con il log nel tuo ambiente dev locale. – Beartech

risposta

1

Si verifica perché il valore della chiave primaria (id) esiste già. Perché? Perché la sequenza di tasti primaria in Postgres è incasinata. senza consultare il database o conoscere lo schema, è difficile suggerire una soluzione, ma se il database può causare un downtime di 10-15 minuti. puoi provare

  1. Se c'è solo un tavolo che è un problema. puoi esportare tutti i dati in un nuovo set di tabelle con nuovi nomi senza colonna ID.
  2. eliminare le tabelle esistenti e rinominare la tabella appena creata nel nome delle tabelle precedenti.
  3. abilita nuovamente le scritture sulla nostra app.

Ma se l'intero DB è in disordine, allora ha bisogno di qualcosa di più elaborato ma non posso dirlo senza guardare lo schema.

+0

Bene, capisco cosa e perché. L'ActveRecord 'reset_pk_sequence!' Ho accennato sopra dovrebbe risolvere questo. Quello che non capisco veramente (e cosa vorrei impedire) è il motivo per cui questo si ripresenta ad ogni nuova spinta dell'app. – denishaskin

+1

puoi pubblicare un'app campione che riproduca questo? – CuriousMind

+0

@CuriousMind. Sto avendo lo stesso problema dell'OP. Ogni volta che provo a indicizzare gli ID di 1, quindi sì, c'è un contatore che è spento. Ma ho 130 articoli e ho tabelle collegate tramite l'ID, quindi non voglio ricreare la tabella. Il mio database PostgresQL (in realtà PostGIS) esisteva già e l'ho collegato al mio nuovo progetto Rails. Quindi qualcuno ha idea di dove si trova il contatore e come resettarlo? Forse posso provare 125 volte in più e arrivare alla fine del database. – Greg

Problemi correlati