2010-02-17 32 views
0

我有一个创建自动递增的主标识的postres序列,然后迁移执行语句改变列,并指定默认值:db:migrate创建序列但不更改表?

execute 'CREATE SEQUENCE "ServiceAvailability_ID_seq";' 
execute <<-SQL 
    ALTER TABLE "ServiceAvailability" 
    ALTER COLUMN "ID" set DEFAULT NEXTVAL('ServiceAvailability_ID_seq'); 
SQL 

如果我运行的db:迁移一切似乎工作在返回的没有错误,但是,如果我运行的Rails应用程序我得到:

Mnull value in column "ID" violates not-null constraint

我已经通过手动执行的迁移的SQL语句,这个错误是因为ALTER语句是没有发现工作,还是没有被执行。

如果我手动执行以下语句:

CREATE SEQUENCE "ServiceAvailability_ID_seq; 

我得到:

error : ERROR: relation "serviceavailability_id_seq" already exists

这意味着移民成功创建序列!但是,如果我手动运行:

ALTER TABLE "ServiceProvider" 
    ALTER COLUMN "ID" set DEFAULT NEXTVAL('ServiceProvider_ID_seq'); 
SQL 

它成功运行并创建默认的NEXTVAL。

所以问题是,为什么迁移文件使用第一个execute语句创建序列,但不能在第二个执行中更改表? (记住,没有错误上运行的数据库输出:迁移)

谢谢你,道歉TL:博士

回答

0

我分开序列的创建和表的改变分为两个迁移。

在运行:将不会创建

rake db:migrate 

序列,也不是表,变更和耙将成功运行。

但是,如果我跑迁移seperately:

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

序列将被创建,并如预期变更的表。