sql >> Databáze >  >> RDS >> PostgreSQL

Proč rails 5 přidává metodu nextval do souboru schématu?

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.



  1. Porovnání duplicitních hodnot sloupců Oracle pomocí Soundex, Jaro Winkler a Edit Distance (UTL_MATCH)

  2. Jak sledovat zobrazení stránek bez narušení databáze MySQL

  3. Vypočítejte mediány pro více sloupců ve stejné tabulce v jednom volání dotazu

  4. docker-compose nespustí postgresový obrázek