Toto je trochu dlouhá odpověď, takže jsem ji rozdělil na části. Připoutejte se!
Moje teorie
Můj odhad je, že vaše vývojová databáze dělá obsahovat lessons_id_seq
sekvence a její definice flightlessons.id
je nastaveno tak, aby na něm záviselo (tj. přesně to, co Rails vkládá do vašeho souboru schématu).
Jak a proč? Pravděpodobně jste přejmenovali lessons
tabulky na flightlessons
v určitém okamžiku v minulosti, ale toto přejmenování nezměnilo sekvenci, na které tabulka závisela – a protože schema.rb
ne sekvence záznamu, lessons_id_seq
sekvence se nezkopíruje do vaší testovací databáze, a proto se zobrazí tato chyba.
Pro ověření mé teorie spusťte rails db
a vyzkoušejte následující příkazy:
\d lessons_id_seq
To by mělo vrátit definici této sekvence. Pak zkuste:
\d flightlessons
A podívejte se na definici id
sloupec. Očekávám, že bude obsahovat DEFAULT nextval('lessons_id_seq')
.
Opravy
Nejjednodušší způsob, jak to vyřešit, je přejít na použití structure.sql
místo schema.rb
(viz dokumenty
). Tím se přenese přesný stav vaší databáze a zabrání se jakémukoli rušení nebo interpretaci ze strany Rails, což je příčinou vašeho aktuálního problému. Vždy doporučuji structure.sql
pro produkční systémy.
Můžete však také přejít do své vývojové databáze a změnit název sekvence:
ALTER SEQUENCE lessons_id_seq RENAME TO flightlessons_id_seq;
ALTER TABLE flightlessons ALTER COLUMN id SET DEFAULT nextval('flightlessons_id_seq');
V produkčním systému by to byl hrozný nápad, ale pokud je váš problém pouze místní, měl by to opravit váš aktuální stav databáze pomocí vašeho schema.rb
a tím řešit váš aktuální problém. Možná to budete chtít zakódovat do migrace, pokud chcete rails db:drop db:create db:migrate
pracovat na nové aplikaci.
Proč teď?
Chování, kdy Rails vyhazuje default
Hodnota primárního klíče vaší tabulky může být v Rails 5 velmi dobře nová. Dříve mohl Rails důvěřovat tomu, že váš sloupec ID má rozumnou výchozí hodnotu, a ignoroval jakoukoli hodnotu, kterou skutečně viděl. Ale neprovedl jsem průzkum, abych zjistil, zda je to pravda nebo ne.