Det här är ett lite långt svar, så jag har delat upp det i avsnitt. Spänn fast!
Min teori
Min gissning är att din utvecklingsdatabas gör det innehålla lessons_id_seq
sekvens, och att dess definition av flightlessons.id
är inställd på att bero på det (dvs exakt vad Rails lägger in i din schemafil).
Hur och varför? Du har förmodligen bytt namn på lessons
tabell till flightlessons
någon gång i det förflutna, men det ändrade namnet ändrade inte sekvensen som tabellen var beroende av -- och eftersom schema.rb
gör inte postsekvenser, lessons_id_seq
sekvensen kopieras inte till din testdatabas, och därför får du det här felet.
För att verifiera min teori, kör rails db
och prova följande kommandon:
\d lessons_id_seq
Detta bör returnera definitionen av den sekvensen. Försök sedan:
\d flightlessons
Och titta på definitionen av id
kolumn. Jag förväntar mig att den ska inkludera DEFAULT nextval('lessons_id_seq')
.
Åtgärningar
Det enklaste sättet att fixa detta är att byta till att använda structure.sql
istället för schema.rb
(se dokumenten
). Detta kommer att överföra det exakta tillståndet för din databas och undvika störningar eller tolkningar från Rails, vilket är det som orsakar ditt aktuella problem. Jag rekommenderar alltid structure.sql
för produktionssystem.
Men du kan också gå in i din utvecklingsdatabas och ändra sekvensnamnet:
ALTER SEQUENCE lessons_id_seq RENAME TO flightlessons_id_seq;
ALTER TABLE flightlessons ALTER COLUMN id SET DEFAULT nextval('flightlessons_id_seq');
Detta skulle vara en hemsk idé på ett produktionssystem, men om ditt problem bara är lokalt bör det rätta till din nuvarande databasstatus med ditt schema.rb
och därmed ta itu med ditt nuvarande problem. Du kanske vill koda det till en migrering, om du vill ha rails db:drop db:create db:migrate
att arbeta med en ny app.
Varför nu?
Beteendet där Rails dumpar default
värdet för din tabells primärnyckel kan mycket väl vara nytt i Rails 5. Tidigare kan Rails bara ha litat på att din ID-kolumn hade en förnuftig standard, och ignorerat vilket värde den faktiskt såg. Men jag har inte gjort research för att se om det är sant eller inte.