db: migrate создает последовательности, но не меняет таблицу? - PullRequest
0 голосов
/ 17 февраля 2010

У меня есть миграция, которая создает последовательность 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

1 Ответ

0 голосов
/ 18 февраля 2010

Я разделил создание последовательностей и изменение таблиц на две миграции.

При работе:

rake db:migrate

Последовательности не будут созданы, а таблицы не изменены, и грабли будут успешно выполняться.

Если, однако, я управлял миграциями отдельно:

rake db:migrate VERSION=1
rake db:migrate VERSION=2

Последовательности будут созданы, а таблицы изменены в соответствии с ожиданиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...