PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Защо rails 5 добавя метод nextval във файла на схемата?

Това е малко дълъг отговор, затова го разделих на секции. Закопчайте!

Моята теория

Предполагам, че вашата база данни за разработка прави съдържат 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 колона има нормална стойност по подразбиране и да е игнорирал каквато и да е стойност, която действително е виждал. Но не съм направил проучване, за да видя дали това е вярно или не.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL заявка за съвпадение на един от множество низове

  2. Генериране на потребителска парола за postgresql

  3. Как да направите заявка за JSON елемент

  4. Как да заявите стойности със заместващи знаци в PostgreSQL hstore

  5. Има ли начин да *не* използвате подготвени от страна на сървъра изрази в Postgresql?