PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Perché rails 5 aggiunge il metodo nextval nel file di schema?

Questa è una risposta un po' lunga, quindi l'ho suddivisa in sezioni. Allaccia le cinture!

La mia teoria

La mia ipotesi è che il tuo database di sviluppo fa contengono il lessons_id_seq sequenza e che la sua definizione di flightlessons.id è impostato per dipendere da esso (ovvero, esattamente ciò che Rails sta inserendo nel file dello schema).

Come e perché? Probabilmente hai rinominato le lessons tabella a flightlessons ad un certo punto in passato, ma quella ridenominazione non ha cambiato la sequenza da cui dipendeva la tabella -- e poiché schema.rb non sequenze di record, il lessons_id_seq la sequenza non viene copiata nel database di test e quindi viene visualizzato questo errore.

Per verificare la mia teoria, esegui rails db e prova i seguenti comandi:

\d lessons_id_seq

Questo dovrebbe restituire la definizione di quella sequenza. Quindi, prova:

\d flightlessons

E guarda la definizione di id colonna. Mi aspetto che includa DEFAULT nextval('lessons_id_seq') .

Correzioni

Il modo più semplice per risolvere questo problema è passare all'utilizzo di structure.sql invece di schema.rb (vedi i documenti ). Ciò manterrà lo stato esatto del tuo database ed eviterà qualsiasi interferenza o interpretazione da parte di Rails, che è ciò che sta causando il tuo problema attuale. Consiglio sempre structure.sql per sistemi di produzione.

Tuttavia, puoi anche accedere al tuo database di sviluppo e modificare il nome della sequenza:

ALTER SEQUENCE lessons_id_seq RENAME TO flightlessons_id_seq;
ALTER TABLE flightlessons ALTER COLUMN id SET DEFAULT nextval('flightlessons_id_seq');

Questa sarebbe una pessima idea su un sistema di produzione, ma se il tuo problema è solo locale, dovrebbe correggere lo stato del tuo database attuale con il tuo schema.rb e quindi affrontare il tuo problema attuale. Potresti voler codificarlo in una migrazione, se vuoi rails db:drop db:create db:migrate per lavorare su una nuova app.

Perché adesso?

Il comportamento in cui Rails sta scaricando il default il valore per la chiave primaria della tua tabella potrebbe benissimo essere nuovo in Rails 5. In precedenza, Rails potrebbe essersi semplicemente fidato del fatto che la tua colonna ID avesse un valore predefinito sano e ignorato qualunque valore effettivamente vedesse. Ma non ho fatto la ricerca per vedere se è vero o no.