Това е малко дълъг отговор, затова го разделих на секции. Закопчайте!
Моята теория
Предполагам, че вашата база данни за разработка прави съдържат lessons_id_seq
последователност и неговата дефиниция на flightlessons.id
е настроен да зависи от него (т.е. точно това, което Rails поставя във вашия файл със схема).
Как и защо? Вероятно сте преименували lessons
таблица към flightlessons
в някакъв момент в миналото, но това преименуване не промени последователността, от която зависи таблицата -- и от schema.rb
правине запис на последователности, lessons_id_seq
последователността не се копира във вашата тестова база данни и по този начин получавате тази грешка.
За да проверите моята теория, стартирайте rails db
и опитайте следните команди:
\d lessons_id_seq
Това трябва да върне дефиницията на тази последователност. След това опитайте:
\d flightlessons
И вижте дефиницията на id
колона. Очаквам да включва DEFAULT nextval('lessons_id_seq')
.
Поправки
Най-лесният начин да поправите това е да преминете към използване на structure.sql
вместо schema.rb
(вижте документите
). Това ще пренесе точното състояние на вашата база данни и ще избегне всякаква намеса или интерпретация от Rails, което е причината за текущия ви проблем. Винаги препоръчвам structure.sql
за производствени системи.
Можете обаче също да влезете в базата данни за разработка и да промените името на последователността:
ALTER SEQUENCE lessons_id_seq RENAME TO flightlessons_id_seq;
ALTER TABLE flightlessons ALTER COLUMN id SET DEFAULT nextval('flightlessons_id_seq');
Това би било ужасна идея за производствена система, но ако проблемът ви е само локален, той трябва да коригира текущото ви състояние на база данни с вашия schema.rb
и по този начин да разрешите текущия си проблем. Може да искате да кодирате това в миграция, ако искате rails db:drop db:create db:migrate
за работа върху ново приложение.
Защо сега?
Поведението, при което Rails изхвърля default
стойността за първичния ключ на вашата таблица може много добре да е нова в Rails 5. Преди това Rails може просто да се е доверявал, че вашата ID колона има нормална стойност по подразбиране и да е игнорирал каквато и да е стойност, която действително е виждал. Но не съм направил проучване, за да видя дали това е вярно или не.