IT TIP

Rails 3.1을 여러 데이터베이스와 연결

itqueen 2020. 10. 13. 19:59
반응형

Rails 3.1을 여러 데이터베이스와 연결


ShowNearby에서 우리는 PHP에서 RoR 3.1로 매우 큰 마이그레이션을 해왔고 여러분 중 일부는 이전에 해결했을 수있는 몇 가지 문제에 직면 해 있습니다.

우리는 많은 양의 데이터를 가지고 있고 우리는 우리가 개별적으로 처리 할 수있는 여러 DB로 DB를 분리하기로 결정했습니다. 예를 들어, 우리의 계정, 장소, 로그 및 기타는 여러 데이터베이스로 분할됩니다.

우리는 마이그레이션, 비품, 모델을 가져 와서 멋지게 플레이해야하는데 지금까지는 꽤 지저분했습니다. 솔루션에 대한 일부 요구 사항은 다음과 같습니다.

  • 하나의 모델은 데이터베이스 중 하나에있는 하나의 테이블과 관련되어야합니다.
  • rake db : drop-database.yml에서 지정한 모든 데이터베이스 환경을 삭제해야합니다.
  • rake db : create-database.yml에서 지정한 모든 데이터베이스 환경을 만들어야합니다.
  • rake db : migrate-다양한 데이터베이스로 마이그레이션을 실행해야합니다.
  • rake db : test-픽스쳐를 잡고 다양한 데이터베이스와 테스트 유닛 / 함수 / 등에 드롭해야합니다.

우리는 각 데이터베이스마다 별도의 레일 프로젝트를 설정하고 ActiveResource와 연결하는 것을 고려하고 있지만 이것이 그다지 효율적이지 않다고 생각합니다. 이전에 비슷한 문제를 겪은 적이 있습니까?


Wukerplank의 대답에 대해 평소와 같이 database.yml에 다음과 같은 이름으로 연결 세부 정보를 넣을 수도 있습니다.

log_database_production:
  adapter: mysql
  host: other_host
  username: logmein
  password: supersecret
  database: logs

그런 다음 특수 모델에서 :

class AccessLog < ActiveRecord::Base
  establish_connection "log_database_#{Rails.env}".to_sym
end

이러한 성가신 자격 증명이 애플리케이션 코드에 포함되지 않도록합니다.

편집 : 여러 모델이 연결을 다시 사용하려는 경우 연결이 단단히 클래스에 결합되어 있기 때문에 (설명 된 바와 같이, 당신은 그것에서 새로운 추상 클래스와 상속을 만들어야합니다 여기 , 여기 , 그리고 여기 ), 새로운 연결이 생성됩니다 각 클래스.

이 경우 다음과 같이 설정하십시오.

class LogDatabase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "log_database_#{Rails.env}".to_sym
end

class AccessLog < LogDatabase
end

class CheckoutLog < LogDatabase
end

다른 데이터베이스에 연결하는 것은 매우 쉽습니다.

# model in the "default" database from database.yml
class Person < ActiveRecord::Base

  # ... your stuff here

end

# model in a different database
class Place < ActiveRecord::Base

  establish_connection (
    :adapter  => "mysql",
    :host     => "other_host",
    :username => "username",
    :password => "password",
    :database => "other_db"
  )

end

컨트롤러에 대한 데이터 검색에 많은 오버 헤드가 추가되어 작업 속도가 느려질 수 있으므로 여러 Rails 프로젝트를 설정하는 데주의해야합니다.

마이그레이션, 고정 장치, 모델 등에 대한 질문 : 쉬운 방법은 없을 것 같으므로 별도의 질문을 게시하고 최대한 구체적으로 작성하십시오.

DB를 하나로 통합하는 것은 옵션이 아닙니까? 그것은 당신의 삶을 훨씬 더 쉽게 만들 것입니다!


이 작업을 수행하는 올바른 방법을 다른 사람들에게 알려줄 훌륭한 게시물을 찾았습니다. http://blog.bitmelt.com/2008/10/connecting-to-multiple-database-in-ruby.html을 확인하십시오.

다음과 같이 설정하십시오.

database.yml (db 구성 파일)

support_development:
    adapter: blah
    database: blah
    username: blah
    password: blah

support_base.rb (모델 파일)

class SupportBase < ActiveRecord::Base
    self.abstract_class = true #important!
    establish_connection("support_development")
end

tst_test.rb (모델 파일)

class TstTest < SupportBase 
    #SupportBase not ActiveRecord is important!

    self.table_name = 'tst_test'

    def self.get_test_name(id)
        if id = nil
            return ''
        else
            query = "select tst_name from tst_test where tst_id = \'#{id}\'"
            tst = connection.select_all(query) #select_all is important!
            return tst[0].fetch('tst_name')
        end
    end
end

추신, 이것은 실제로 마이그레이션을 다루지 않습니다. 레이크를 사용하여 둘 이상의 DB에서 마이그레이션을 수행 할 수 있다고 생각하지 않습니다 (하드 '할 수 없음'인지 확실하지 않지만 가능할 수 있습니다). 이것은 제어하지 않는 다른 DB를 연결하고 쿼리하는 좋은 방법이었습니다.


Rails 환경을 추가 할 수도 있으므로 개발 및 테스트 데이터베이스가 동일하지 않습니다.

establish_connection "legacy_#{Rails.env}"

The following article suggests defining new Rake tasks to achieve migrations against multiple databases. Each task sets up its own connection and then executes the migration with this connection and the specific database folder.

It also defines a familiar db:migrate that calls the two other tasks.

Including here incase the link becomes unavailable:

desc "Migrate the database through scripts in db/migrate directory."

namespace :db do
  task :migrate do
    Rake::Task["db:migrate_db1"].invoke
    Rake::Task["db:migrate_db2"].invoke
  end

  task :migrate_db1 do
    ActiveRecord::Base.establish_connection DB1_CONF
    ActiveRecord::Migrator.migrate("db/migrate/db1/")
  end

  task :migrate_db2 do
    ActiveRecord::Base.establish_connection DB2_CONF
    ActiveRecord::Migrator.migrate("db/migrate/db2/")
  end
end

Source: Ruby on Rails Connect to Multiple Databases and Migrations


Hey this post is old but I've found a solution working on Rails 3.2 that might help someone else. https://stackoverflow.com/a/16542724/1447654

참고URL : https://stackoverflow.com/questions/6122508/connecting-rails-3-1-with-multiple-databases

반응형