Pam*_*orp 5 database postgresql ruby-on-rails schema.rb database-schema
我有一个使用三个现有数据库的Rails 5应用程序。此应用程序不需要迁移。我想构建db/schema.rb为包括所有三个数据库,而不仅仅是主数据库。执行rake db:schema:dump将使用主数据库重建架构。我相信有一种方法可以做到这一点,但是由于某种原因,我一直在搜索的方式上却找不到任何东西。我发现的所有帖子都讨论了如何使用来自不同数据库的模型,而不是如何重建架构以包括所有数据库。
大约一个月前,我再次开始关注这个问题。在审查了几个选项后,我发现了 @ostinelli 创建的解决方案,该解决方案运行良好且易于实施。该解决方案为每个维护的数据库创建单独的迁移,而不是将它们全部放在单个架构文件中。我的目标主要是为每个数据库建立一个模式,这为我完成了。有一些部分我没有实现,因为它们不需要。
http://www.ostinelli.net/setting-multiple-databases-rails-definitive-guide/
我为每个数据库创建了单独的数据库 yml 文件,如下所示:
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 %>
Run Code Online (Sandbox Code Playgroud)
然后我为每个数据库创建了单独的数据库 rake 任务:
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
Run Code Online (Sandbox Code Playgroud)
然后我为其他数据库创建了自定义迁移生成器。
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
Run Code Online (Sandbox Code Playgroud)
我为每个数据库创建了类似于以下内容的数据库迁移:
rails g stats_migration create_clicks
create db_stats/migrate/20151201191642_create_clicks.rb
rake stats:db:create
rake stats:db:migrate
Run Code Online (Sandbox Code Playgroud)
然后为其他数据库创建单独的数据库初始值设定项,然后修改每个模型。
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
Run Code Online (Sandbox Code Playgroud)
当我第一次写这个问题时,我的应用程序中有三个数据库。我现在正在添加另一个数据库。我非常感谢@ostinelli 写了这篇文章。这让我的生活变得更轻松。
| 归档时间: |
|
| 查看次数: |
601 次 |
| 最近记录: |