단일 MySQL 서버에서 여러 개의 Rails 앱을 실행하고 있습니다. 모두 동일한 앱을 실행하며 모든 데이터베이스는 동일한 스키마를 갖지만 각 데이터베이스는 다른 고객에 속합니다.레일스에서 여러 데이터베이스를 반복적으로 반복하는 방법
개념적으로, 여기에 내가하고 싶은 작업은 다음과 같습니다
Customer.all.each do |customer|
connection.execute("use #{customer.database}")
customer.do_some_complex_stuff_with_multiple_models
end
, 기본 모델 클래스는 A/R 연결에서 다른 데이터베이스 연결을 캐시이가 웹 요청을 실행하면, 때문에이 방식이 작동하지 않습니다 풀. 따라서 "use"문을 실행하는 연결은 모델이 사용하는 연결이 아닐 수도 있습니다.이 경우에는 잘못된 데이터베이스를 쿼리합니다.
ActiveRecord::Base.clear_active_connections!
ActiveRecord::Base.establish_connection(each_customer_database_config)
내가 믿고 :
내가 대신 "사용"문에, 레일 A/R 코드 (버전 3.0.3)를 통해 읽고, 루프에서 실행이 코드를 함께했다 연결 풀이 스레드 당 하나이므로 연결 풀이 망가져 웹 요청이있는 하나의 스레드에 대해서만 다시 연결되는 것처럼 보입니다. 그러나 연결이 어떤 방식 으로든 공유되지 않는다면, 동일한 코드에서 다른 활성 웹 요청으로 인해 코드가 혼란에 빠지 길 바라지 않을 것입니다.실행중인 웹 앱에서이 작업을 수행하는 것이 안전합니까? 이것을 할 수있는 다른 방법이 있습니까?
그냥 infelicitously, MySQL은 _does_ 지원 SQL 스키마를 명확하지만, 원래하고는 그들에게 전화를 SQL 키워드 "SCHEMA"는 버전 5.0.2 (2004 년 12 월) 이후로 인식됩니다. "USE foo"를 MySQL에 사용하는 것은 PostgreSQL 연결의'search_path'를 단일 네임 스페이스 "foo"로 설정하는 것과 유사합니다. – pilcrow
물론입니다. MYSQL에서 "create database abc"대신 "create schema abc"라고 쓸 수도 있습니다. – Jagira