3 개의 다른 기존 데이터베이스를 사용하는 Rails 5 애플리케이션이 있습니다. 이 애플리케이션에는 마이그레이션이 필요하지 않았습니다. 나는 db/schema.rb
을 구축하여 주 데이터베이스뿐만 아니라 세 데이터베이스를 모두 포함하고자합니다. rake db:schema:dump
을 실행하면 주 데이터베이스를 사용하여 스키마가 다시 작성됩니다. 나는 이것을 할 수있는 방법이 있다고 믿는다. 그러나 내가 무엇을 찾고 있었는지에 관해서 나는 이것에 관해 무엇인가 찾을 수 없다. 내가 찾은 모든 게시물은 다른 데이터베이스의 모델을 사용하는 방법을 논할뿐, 스키마를 재 구축하여 모든 데이터베이스를 포함하는 방법을 설명하지는 않습니다.db/schema.rb를 재 구축하여 마이그레이션하지 않고 여러 데이터베이스를 포함 할 수 있습니까?
3
A
답변
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가 이것을 썼다는 것에 매우 감사한다. 그것은 내 인생을 더 쉽게 해줬습니다.
관련 문제
- 1. EF5에서 마이그레이션하지 않고 데이터베이스를 만들 수 있습니까?
- 2. AsynchResult Object를 재 구축하여 푸시 기술을 시뮬레이션 할 수 있습니까?
- 3. 마이그레이션하지 않고 코어 데이터 모델 바꾸기
- 4. 파일을 마이그레이션하지 않고 도메인 만 변경하는 방법
- 5. firebase로 마이그레이션하지 않고 google-services.json을 얻는 방법
- 6. 내 데이터베이스를 삭제하고 삭제하지 않고 업데이트 할 수 있습니까?
- 7. 데이터베이스를 삭제하지 않고 교리 조명기를로드 할 수 있습니까
- 8. 서버에 연결하지 않고 perl에서 mysql 데이터베이스를 생성 할 수 있습니까?
- 9. 플라스크에 포함 할 수 있습니까?
- 10. 마이그레이션하지 않고 앱 업데이트에서 핵심 데이터 데이터베이스 업데이트
- 11. 데이터베이스 프로젝트에서 데이터베이스를 초기화 할 수 있습니까?
- 12. 라우터에 여러 개의 loadChildren을 포함 할 수 있습니까?
- 13. 가로로 비례하는 데이터베이스를 추천 할 수 있습니까?
- 14. 마이그레이션하지 않고 EF 코어에서 모델 변경시 데이터베이스 삭제
- 15. 어떻게이 데이터베이스를 구조화 할 수 있습니까?
- 16. 마이그레이션하지 않고 모델을 사용 하시겠습니까? (그냥 데이터베이스에서 선택)
- 17. 버클리 데이터베이스를 열고 동시에 여러 프로그램에서 액세스 할 수 있습니까?
- 18. WCF 데이터 서비스를 사용하여 여러 데이터베이스를 쿼리 할 수 있습니까?
- 19. SQLAlchemy로 여러 Python 프로세스간에 SQLite 데이터베이스를 공유 할 수 있습니까?
- 20. 설치하지 않고 lxml과 같은 라이브러리를 포함 할 수 있습니까?
- 21. 오프라인 데이터베이스를 보유 할 수 있습니까?
- 22. 앱을 설치/업그레이드 할 때 데이터베이스를 업데이트 할 수 있습니까?
- 23. 먼저 데이터베이스를 삭제하지 않고 레일즈로 데이터베이스를 첫 번째 버전으로 마이그레이션 할 수 있습니까?
- 24. 문자열을 포함 할 수 있습니까?
- 25. iPad 화면에 여러 MoviePlayer 인스턴스를 포함 할 수 있습니까?
- 26. xpath, python에 여러 개의 태그를 포함 할 수 있습니까?
- 27. JSON 객체에 여러 개의 키를 포함 할 수 있습니까?
- 28. 하나의 레이어에 여러 개의 KineticJS 애니메이션을 포함 할 수 있습니까?
- 29. 텍스트 영역을 여러 양식에 포함 할 수 있습니까?
- 30. 웹 서비스에 여러 개의 xsd 매핑을 포함 할 수 있습니까?