加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

用于postgreSQL模式的Rails迁移

发布时间:2020-12-13 16:29:26 所属栏目:百科 来源:网络整理
导读:我正在为不同的客户端使用PostgreSQL架构的多租户轨道应用程序. Rails迁移不适用于开箱即用的多个架构,所以我进行了以下耙子任务来迁移所有模式,并且它似乎工作.我的问题是如果其他人实施了更好和更优雅的解决方案.我也会很高兴一个很好的教程,包括使用多个
我正在为不同的客户端使用PostgreSQL架构的多租户轨道应用程序. Rails迁移不适用于开箱即用的多个架构,所以我进行了以下耙子任务来迁移所有模式,并且它似乎工作.我的问题是如果其他人实施了更好和更优雅的解决方案.我也会很高兴一个很好的教程,包括使用多个模式的PostgreSQL的rails代码示例.到目前为止,我只发现了一个关于 http://aac2009.confreaks.com/06-feb-2009-14-30-writing-multi-tenant-applications-in-rails-guy-naor.html的主题的一个很好的介绍,以及我正在为tomayko.com/writings/rails-multiple-connections
desc 'Migrates all postgres schemas'
task :schemas do
  # get all schemas
  env = "#{RAILS_ENV}"
  config = YAML::load(File.open('config/database.yml'))
  ActiveRecord::Base.establish_connection(config[env])
  schemas = ActiveRecord::Base.connection.select_values("select * from pg_namespace where nspname != 'information_schema' AND nspname NOT LIKE 'pg%'")
  puts "Migrate schemas: #{schemas.inspect}"
  # migrate each schema
  schemas.each do |schema|
    puts "Migrate schema: #{schema}"
    config = YAML::load(File.open('config/database.yml'))
    config[env]["schema_search_path"] = schema
    ActiveRecord::Base.establish_connection(config[env])
    ActiveRecord::Base.logger = Logger.new(STDOUT)
    ActiveRecord::Migrator.migrate('db/migrate',ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
  end
end
我有一个我使用的schema_utils库,并具有以下处理迁移的方法:
def self.with_schema(schema_name,&block)
    conn = ActiveRecord::Base.connection
    old_schema_search_path = conn.schema_search_path
    conn.schema_search_path = schema_name
    begin
      yield
    ensure
      conn.schema_search_path = old_schema_search_path
    end
  end

然后我正常使用迁移,所以我可以继续调用rake:migrate
现在,在迁移中可以使用:

...
schemas.each do |schema|
  SchemaUtils.with_schema(schema) do
    #Put migration code here
    #e.g. add_column :xyz,...
  end
end

因为我倾向于将模式映射到帐户代码,所以我执行以下操作:

Account.for_each do |account|
  SchemaUtils.with_schema(account.code) do
    #Put migration code here
  end
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读