sql >> Databasteknik >  >> RDS >> PostgreSQL

Varför lägger rails 5 till nästaval-metoden i schemafilen?

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.



  1. Vad är Oracles datumformateringsmask för tidszoner?

  2. Korrekt syntax för array av sammansatt typ

  3. Generera SQL-schema från XML

  4. Hur man kontrollerar om PostgreSQL-arrayen innehåller värde