sql - postgreSQL 模式的 Rails 迁移

标签 sql ruby-on-rails postgresql migration multi-tenant

我正在为不同的客户端使用 PostgreSQL 架构开发一个 Multi-Tenancy Rails 应用程序。 Rails 迁移不适用于开箱即用的多个模式,因此我执行了以下 rake 任务来迁移所有模式,它似乎可以正常工作。我的问题是其他人是否实现了更好、更优雅的解决方案。我也很高兴有一个很好的教程,包括使用多个模式的 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

关于sql - postgreSQL 模式的 Rails 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1970564/

相关文章:

mysql - MySQL 中的 OUTPUT 子句

sql - 使用 Cross Join 时的 Group By 语法

ruby-on-rails - 在 Rails 中排序 : SQLite vs PostgreSQL

ruby-on-rails - 在产品中生成 .zip 文件的问题 (Rails 3)

ruby-on-rails - 通过单击按钮完成文件选择时如何测试文件字段?

postgresql - 如何使用 SQLAlchemy 和 alembic 声明 NOT VALID PostgreSQL 约束?

sql - PostgreSQL 强制标准 SQL 语法

mysql - 在 MySQL 中存储 0.5

MySQL 错误代码 1452 外键约束

ruby-on-rails - 将以太坊节点绑定(bind)到Rails应用程序中,得到 'JSON::ParserError: 776'