У меня есть миграция, которая создает последовательность postres для автоматического увеличения первичного идентификатора, а затем выполняет инструкцию для изменения столбца и указания значения по умолчанию:
execute 'CREATE SEQUENCE "ServiceAvailability_ID_seq";'
execute <<-SQL
ALTER TABLE "ServiceAvailability"
ALTER COLUMN "ID" set DEFAULT NEXTVAL('ServiceAvailability_ID_seq');
SQL
Если я запускаю db: migrate, кажется, что все работает, при этом никаких ошибок не возвращается, однако, если я запускаю приложение rails, я получаю:
Значение Mnull в столбце "ID" нарушает ненулевое ограничение
Я обнаружил, выполнив оператор sql в миграции вручную, что эта ошибка вызвана тем, что оператор alter не работает или не выполняется.
Если я вручную выполню следующую инструкцию:
CREATE SEQUENCE "ServiceAvailability_ID_seq;
Я получаю:
ошибка: ОШИБКА: отношение "serviceavailability_id_seq" уже существует
Что означает, что миграция успешно создала последовательность! Однако, если я запускаю вручную:
ALTER TABLE "ServiceProvider"
ALTER COLUMN "ID" set DEFAULT NEXTVAL('ServiceProvider_ID_seq');
SQL
Он успешно работает и создает NEXTVAL по умолчанию.
Итак, вопрос в том, почему файл миграции создает последовательность с первым оператором execute, но не изменяет таблицу во втором выполнении? (Помните, что при запуске db: migrate ошибок не выводится)
Спасибо и извинения за tl: dr