2009-12-28 5 views
15

저는 다른 클라이언트를 위해 PostgreSQL 스키마를 사용하는 멀티 테넌트 레일 애플리케이션을 개발 중입니다. 레일즈 마이그레이션은 여러 개의 스키마를 즉시 사용할 수 없으므로 모든 스키마를 마이그레이션하기 위해 다음과 같은 레이크 작업을 수행했습니다. 내 질문은 다른 사람들이 더 훌륭하고 우아한 솔루션을 구현 한 것입니다. 또한 여러 스키마를 사용하는 PostgreSQL의 레일즈 코드 예제를 포함하여 좋은 자습서에 만족합니다. 지금까지 난 단지 주제 http://aac2009.confreaks.com/06-feb-2009-14-30-writing-multi-tenant-applications-in-rails-guy-naor.html에 좋은 프리젠 테이션 내가 tomayko.com/writings/rails-multiple-connections을 목표로하고있는 무슨의 예를 발견 내가있어 경우postgreSQL 스키마를위한 레일스 마이그레이션

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 
+0

Liquibase는 제가 알고있는 한 스키마와 함께 작동합니다. – Janning

+1

@ Janning Liquibase는 레일스가 사용하는 ActiveRecord 모듈과 호환되는 솔루션이 아닙니다. – lillq

답변

0

잘 모르겠어요 질문을하지만 각기 다른 "데이터베이스"를 사용하여 database.yml에 몇 가지 환경을 추가로 선언해야합니까?

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 

은 그때 내가 레이크 전화를 계속 정상적으로 마이그레이션을 사용합니다 :

+2

포스트그레스의 스키마는 데이터베이스 내에 있습니다. I.E 하나의 데이터베이스는 많은 스키마를 가질 수 있습니다. – lillq

8

나는 내가 사용 및 취급 마이그레이션에 대한 다음과 같은 방법이있는 schema_utils 라이브러리가 당신의 마이그레이션에 지금 마이그레이션을하면 사용할 수 있습니다

... 
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 
0

이러한 시나리오, 즉 여러 응용 프로그램이 동일한 데이터베이스를 공유하는 상황으로 인해 pg_migrate이라고 썼습니다. 아마도 이것을 처리 할 레일스 방법 (엔진?)이 있지만 레일스가 아닌 또 다른 응용 프로그램이 너무 많아서 데이터베이스를 필요로하는 이유는 무엇입니까?

이 경우 pg_migrate의 핵심 기능은 루비 보석을 생성 할 수 있다는 것입니다. 따라서 모든 하위 응용 프로그램과 별도로 데이터베이스 스키마를 유지 관리 할 수 ​​있지만 모두 참조 할 수 있습니다. 당신이 pg_migrate의 '패키지'명령을 사용하여 루비 보석을 구축 한 후 레일 Gemfile에

은, 당신은 할 수 있습니다 :

gem 'my_db', gem 'jam_db', :path=> "../my_db/gem_package" 
0

확인 바로 그 목적을 위해 지어진 년대 apartment 보석. 그것은 훌륭합니다.