【问题标题】:db:migrate creates sequences but doesn't alter table?db:migrate 创建序列但不改变表?
【发布时间】: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


    【解决方案1】:

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

    运行时:

    rake db:migrate
    

    不会创建序列,也不会更改表,并且 rake 会成功运行。

    但是,如果我单独运行迁移:

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

    将创建序列,并按预期更改表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-17
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多