3

3 개의 다른 기존 데이터베이스를 사용하는 Rails 5 애플리케이션이 있습니다. 이 애플리케이션에는 마이그레이션이 필요하지 않았습니다. 나는 db/schema.rb을 구축하여 주 데이터베이스뿐만 아니라 세 데이터베이스를 모두 포함하고자합니다. rake db:schema:dump을 실행하면 주 데이터베이스를 사용하여 스키마가 다시 작성됩니다. 나는 이것을 할 수있는 방법이 있다고 믿는다. 그러나 내가 무엇을 찾고 있었는지에 관해서 나는 이것에 관해 무엇인가 찾을 수 없다. 내가 찾은 모든 게시물은 다른 데이터베이스의 모델을 사용하는 방법을 논할뿐, 스키마를 재 구축하여 모든 데이터베이스를 포함하는 방법을 설명하지는 않습니다.db/schema.rb를 재 구축하여 마이그레이션하지 않고 여러 데이터베이스를 포함 할 수 있습니까?

답변

1

약 한 달 전에 다시 살펴보기 시작했습니다. 몇 가지 옵션을 검토 한 결과, @ostinelli가 만든 솔루션이 실제로 잘 작동하고 구현하기가 쉽다는 것을 알았습니다. 이 솔루션은 단일 스키마 파일에 모든 데이터를 저장하는 대신 유지 보수되는 각 데이터베이스에 대해 별도의 마이그레이션을 작성합니다. 내 목표는 주로 이것이 달성 한 각 데이터베이스에 대한 스키마를 갖는 것이 었습니다. 필요하지 않았기 때문에 구현하지 않은 부분이 있습니다.

config/database_stats.yml 

development: 
    adapter: postgresql 
    encoding: utf8 
    host: localhost 
    pool: 10 
    database: myapp_stats_development 
    username: postgres 
    password: 

test: 
    adapter: postgresql 
    encoding: utf8 
    host: localhost 
    pool: 10 
    database: myapp_stats_test 
    username: postgres 
    password: 

production: 
    adapter: postgresql 
    encoding: utf8 
    url: <%= ENV["DATABASE_STATS_URL"] %> 
    pool: <%= ENV["DB_POOL"] || 5 %> 

가 그럼 난 각 데이터베이스에 대해 별도의 데이터베이스 레이크 작업 생성 :

http://www.ostinelli.net/setting-multiple-databases-rails-definitive-guide/

는이 같은 각 데이터베이스에 대해 별도의 데이터베이스 YML 파일을 생성

lib/tasks/db_stats.rake 

task spec: ["stats:db:test:prepare"] 

namespace :stats do 

    namespace :db do |ns| 

    task :drop do 
     Rake::Task["db:drop"].invoke 
    end 

    task :create do 
     Rake::Task["db:create"].invoke 
    end 

    task :setup do 
     Rake::Task["db:setup"].invoke 
    end 

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

    task :rollback do 
     Rake::Task["db:rollback"].invoke 
    end 

    task :seed do 
     Rake::Task["db:seed"].invoke 
    end 

    task :version do 
     Rake::Task["db:version"].invoke 
    end 

    namespace :schema do 
     task :load do 
     Rake::Task["db:schema:load"].invoke 
     end 

     task :dump do 
     Rake::Task["db:schema:dump"].invoke 
     end 
    end 

    namespace :test do 
     task :prepare do 
     Rake::Task["db:test:prepare"].invoke 
     end 
    end 

    # append and prepend proper tasks to all the tasks defined here above 
    ns.tasks.each do |task| 
     task.enhance ["stats:set_custom_config"] do 
     Rake::Task["stats:revert_to_original_config"].invoke 
     end 
    end 
    end 

    task :set_custom_config do 
    # save current vars 
    @original_config = { 
     env_schema: ENV['SCHEMA'], 
     config: Rails.application.config.dup 
    } 

    # set config variables for custom database 
    ENV['SCHEMA'] = "db_stats/schema.rb" 
    Rails.application.config.paths['db'] = ["db_stats"] 
    Rails.application.config.paths['db/migrate'] = ["db_stats/migrate"] 
    Rails.application.config.paths['db/seeds'] = ["db_stats/seeds.rb"] 
    Rails.application.config.paths['config/database'] = ["config/database_stats.yml"] 
    end 

    task :revert_to_original_config do 
    # reset config variables to original values 
    ENV['SCHEMA'] = @original_config[:env_schema] 
    Rails.application.config = @original_config[:config] 
    end 
end 

을 그 때 나는 정의를 생성 추가 데이터베이스의 이주 생성자.

lib/generators/stats_migration_generator.rb 

require 'rails/generators/active_record/migration/migration_generator' 

class StatsMigrationGenerator < ActiveRecord::Generators::MigrationGenerator 
    source_root File.join(File.dirname(ActiveRecord::Generators::MigrationGenerator.instance_method(:create_migration_file).source_location.first), "templates") 

    def create_migration_file 
    set_local_assigns! 
    validate_file_name! 
    migration_template @migration_template, "db_stats/migrate/#{file_name}.rb" 
    end 
end 

내가 유사한 각 데이터베이스에 대해 데이터베이스 마이그레이션을 만들어 : 추가 데이터베이스에 대한

rails g stats_migration create_clicks 
create db_stats/migrate/20151201191642_create_clicks.rb 
rake stats:db:create 
rake stats:db:migrate 

그런 다음 생성 된 별도의 데이터베이스 초기화는 각 모델을 수정했습니다.

config/initializers/db_stats.rb 

DB_STATS = YAML::load(ERB.new(File.read(Rails.root.join("config","database_stats.yml"))).result)[Rails.env] 

class Click < ActiveRecord::Base 
    establish_connection DB_STATS 

end 

이 질문을 처음 작성할 때 응용 프로그램에 3 개의 데이터베이스가 있습니다. 나는 이제 또 하나의 데이터베이스를 추가하고있다. 나는 @ostinelli가 이것을 썼다는 것에 매우 감사한다. 그것은 내 인생을 더 쉽게 해줬습니다.

관련 문제