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

Hvorfor tilføjer rails 5 nextval-metoden i skemafilen?

Dette er et lidt langt svar, så jeg har delt det op i sektioner. Spænd op!

Min teori

Mit gæt er, at din udviklingsdatabase gør indeholde lessons_id_seq sekvens, og dets definition af flightlessons.id er indstillet til at afhænge af det (dvs. præcis hvad Rails lægger i din skemafil).

Hvordan og hvorfor? Du har sandsynligvis omdøbt lessons tabel til flightlessons på et tidspunkt i fortiden, men det omdøbning ændrede ikke den rækkefølge, som tabellen var afhængig af -- og da schema.rb gør ikke optagesekvenser, lessons_id_seq sekvensen bliver ikke kopieret til din testdatabase, og dermed får du denne fejl.

For at bekræfte min teori skal du køre rails db og prøv følgende kommandoer:

\d lessons_id_seq

Dette skulle returnere definitionen af ​​den sekvens. Prøv derefter:

\d flightlessons

Og se på definitionen af ​​id kolonne. Jeg forventer, at den indeholder DEFAULT nextval('lessons_id_seq') .

Rettelser

Den nemmeste måde at løse dette på er at skifte til at bruge structure.sql i stedet for schema.rb (se dokumenterne ). Dette vil overføre den nøjagtige tilstand af din database og undgå enhver interferens eller fortolkning fra Rails, hvilket er det, der forårsager dit aktuelle problem. Jeg anbefaler altid structure.sql til produktionssystemer.

Du kan dog også gå ind i din udviklingsdatabase og ændre sekvensnavnet:

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

Dette ville være en frygtelig idé på et produktionssystem, men hvis dit problem kun er lokalt, bør det rette op på din nuværende databasetilstand med dit schema.rb og dermed løse dit nuværende problem. Du ønsker måske at indkode det til en migrering, hvis du vil have rails db:drop db:create db:migrate at arbejde på en ny app.

Hvorfor nu?

Den adfærd, hvor Rails dumper default ud værdien for din tabels primære nøgle kan meget vel være ny i Rails 5. Tidligere har Rails måske bare stolet på, at din ID-kolonne havde en fornuftig standard, og ignoreret den værdi, den faktisk så. Men jeg har ikke lavet research for at se, om det er sandt eller ej.



  1. 3 måder at vise sorteringen for din forbindelse i MariaDB

  2. Hvad er standardrækkefølgen for en liste, der returneres fra et Django-filteropkald?

  3. Hvad er MySQL rækkefølge for SELECT * FROM table_name;?

  4. Doctrine Paginator vælger hele tabellen (meget langsom)?