如何将架构加载到辅助数据库?似乎在Rails中不支持在维护主ActiveRecord::Base.connection
的情况下设置辅助数据库连接的能力。
我们有使用辅助数据库的模型。我们的主数据库是MySQL,辅助数据库是PostgreSQL。要使用ActiveRecord文档的示例:
|
+-- Book
| |
| +-- ScaryBook
| +-- GoodBook
+-- Author
+-- BankAccount
Book
是抽象的,并使用establish_connection
连接到Postgres。
在处理数据库时,我们可以使用ActiveRecord::Base.connection
或Book.connection
。
即便:Rails database tasks in the schema
namespace允许我们转储架构,如下所示:
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
这将允许我执行以下操作:
ActiveRecord::SchemaDumper.dump(Book.connection, file)
但是,加载任务不具备此功能。它只是作为一个整体评估模式文件:
desc 'Load a schema.rb file into the database'
task :load => :environment do
file = ENV['SCHEMA'] || "#{Rails.root}/db/schema.rb"
if File.exists?(file)
load(file)
else
abort %{#{file} doesn't exist yet. Run "rake db:migrate" to create it then try again. If you do not intend to use a database, you should instead alter #{Rails.root}/config/application.rb to limit the frameworks that will be loaded}
end
end
模式文件在没有连接定义的情况下运行ActiveRecord::Schema.define
。 (注意the define method在“当前连接适配器”的上下文中运行。)
如何在不执行临时ActiveRecord::Base.establish_connection
的情况下更改“当前连接适配器”,这不是我想要做的?我基本上希望在ActiveRecord::Schema.define
。
Book.connection
编辑:我会注意到我需要一个运行rake任务的 的程序化解决方案,这就是为什么我在的rake任务中查看以查看它们是什么实际上是在做。
答案 0 :(得分:1)
如何转储架构:
ActiveRecord::Base.establish_connection "custom_db_#{Rails.env}".to_sym
File.open Rails.root.join('db/schema_custom_db.rb'), 'w:utf-8' do |file|
ActiveRecord::SchemaDumper.dump ActiveRecord::Base.connection, file
end
如何加载架构:
ActiveRecord::Tasks::DatabaseTasks.load_schema_current :ruby, Rails.root.join('db/schema_custom_db.rb'), "custom_db_#{Rails.env}"
答案 1 :(得分:0)
我最近一直在努力尝试使用ActiveRecord。我可以加载迁移和转储模式,但是当涉及到加载模式时,我遇到了类似的问题而且它不是Rails或Rake。仅供参考。 我知道你不想这样做,但我正在努力。
请注意看这篇文章: rake db:schema:load vs. migrations
我仍然沉迷于尝试在没有Rails或Rake帮助的情况下独自完成它,以便我更好地了解ActiveRecord的工作原理。
我制作了一个非常小的Rails结构,只是为了生成迁移。
文件结构:
Rakefile
Gemfile
/bin
bundle
rake
rails
/config
application.rb
boot.rb
database.yml
environment.rb
/db
/migrate
development.sqlite3
schema.rb
bin/rails generate migration CreateSystemSettings
我在db / migrate文件夹中得到一个文件20150207170924_create_system_settings.rb。
bin/rake db:migrate
== 20150204070000 DropArticles: migrating
== 20150204070000 DropArticles: migrated (0.0001s)
== 20150207163123 AddPartNumberToProducts: migrating
== 20150207163123 AddPartNumberToProducts: migrated (0.0000s)
== 20150207163909 ChangeSystemSettings: migrating
== 20150207163909 ChangeSystemSettings: migrated (0.0000s)
== 20150207170924 CreateSystemSettings: migrating
-- create_table(:system_settings)
-> 0.0085s
== 20150207170924 CreateSystemSettings: migrated (0.0199s)
这样才有效
更新待处理