【发布时间】:2010-03-30 07:00:05
【问题描述】:
我有一个迁移,它创建一个用于自动递增主标识符的 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 应用程序,我会得到:
“ID”列中的 Mnull 值违反了非空约束
我通过手动执行迁移中的sql语句发现,这个错误是因为alter语句不起作用,或者没有被执行。
如果我手动执行以下语句:
CREATE SEQUENCE "ServiceAvailability_ID_seq;
我明白了:
错误:错误:关系“serviceavailability_id_seq”已经存在
这意味着迁移成功创建了序列!但是,如果我手动运行:
ALTER TABLE "ServiceProvider"
ALTER COLUMN "ID" set DEFAULT NEXTVAL('ServiceProvider_ID_seq');
SQL
它成功运行并创建了默认的 NEXTVAL。
所以问题是,为什么迁移文件在第一个执行语句中创建序列,但在第二个执行语句中没有改变表? (记住,运行 db:migrate 时不会输出错误)
感谢您并为 tl:dr 道歉
【问题讨论】:
标签: ruby-on-rails