在模式中未反映的迁移中创建序列

时间:2012-02-04 21:08:32

标签: ruby-on-rails ruby

我有一个应用程序需要在数据库中存在序列。我有一个迁移,执行以下操作:

class CreateSequence < ActiveRecord::Migration
  def self.up
    execute "CREATE SEQUENCE sequence"
  end

  def self.down
    execute "DROP SEQUENCE sequence"
  end
end

这不会修改schema.rb,因此会中断rake db:setup。如何强制架构包含序列?

注意:运行rake db:migrate后,序列存在。

3 个答案:

答案 0 :(得分:6)

Rails迁移,因为它们的目标是表和字段的模式,而不是包括存储过程,函数和种子数据的完整数据库表示。

运行rake db:setup时,这将创建数据库,加载模式,然后加载种子数据。

一些供您考虑的解​​决方案:

选择1:创建自己的rake任务,独立于Rails Migration up / down进行这些迁移。 Rails迁移只是普通的类,你可以随意使用它们。例如:

rake db:create_sequence

选择2:在加载这样的架构后运行您的特定迁移:

rake db:setup
rake db:migrate:up VERSION=20080906120000

选择3:将序列创建为种子数据,因为它实质上是提供数据(而不是改变模式)。

db/seeds.rb

选择4和我的个人偏好:将迁移运行到已知的好点,包括序列,并保存该空白数据库。更改rake db:setup以克隆该空白数据库。这有点棘手,它牺牲了一些功能 - 所有迁移都是可逆的,迁移工作在多个数据库供应商之上,等等。根据我的经验,这些是很好的权衡。例如:

rake db:fresh  #=> clones the blank database, which you store in version control

答案 1 :(得分:2)

以上所有建议都很好。但是,我认为我找到了更好的解决方案。基本上在你的development.rb put

    config.active_record.schema_format = :sql 

有关详细信息,请参阅我对此问题的回答 - rake test not copying development postgres db with sequences

答案 2 :(得分:0)

查看pg_sequencer宝石。它可以根据需要为您管理Pg序列。我现在能看到的一个缺陷就是它与db/schema.rb不能很好地匹配--Rails会为你的CREATE SEQUENCE字段生成serialpg_sequencer生成序列本身。 (努力解决这个问题。)