gpt4 book ai didi

ruby-on-rails - 在 Rails 4 应用程序中使用 MySQL 和 Postgres

转载 作者:行者123 更新时间:2023-11-29 13:49:19 25 4
gpt4 key购买 nike

我已经使用 MySQL 构建了一个 Rails 应用程序,现在出于性能原因想将一些模型移动到 Postgres 数据库,这些表非常大,而 Postgres 更快。

这些模型与任何其他模型之间没有任何关系。 我不想将整个数据库移动到 Postgres。

这在安装 pg gem 后对我有用:Rails: mysql & postgres at the same time in the same app?

现在我有一个问题:一些加载相同 database.yml 文件的 cron 作业停止工作,因为那些使用 postgres 数据库的模型虽然 YML 没问题,缩进很好,读起来很好,“postgres”部分在那里,Rails 应用程序运行良好。

在我做的 postgres 托管模型中:

class Thing < ActiveRecord::Base
establish_connection(:postgres)
self.table_name = "thingies"
end

然后在 cron 作业中:

dbconfig = YAML::load(File.open('../database.yml'))    
ActiveRecord::Base.establish_connection(dbconfig["production"])
ActiveRecord::Base.establish_connection(dbconfig["postgres"])

然后,当我加载其中一个 postgres 模型时,出现此错误:

/usr/lib/ruby/gems/2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/connection_specification.rb:248:in `resolve_symbol_connection': 'postgres' database is not configured. Available: [] (ActiveRecord::AdapterNotSpecified

我该如何解决这个问题?

稍后编辑:我已经这样做了,而不是为每个数据库手动建立连接。

dbconfig = YAML::load(File.open('../database.yml'))
ActiveRecord::Base.configurations = dbconfig

现在上面的错误消失了,但是 MySQL 模型抛出错误,因为 ActiveRecord 建立了与 postgres 的连接并保持打开状态。

有没有办法为没有指定使用什么连接的模型指定使用什么连接?某种默认值?

最佳答案

通过将模型放入 ActiveRecord 的子类并管理来自它们子类的连接来解决。

这也解决了我的下一个问题,即为每种模型维护一个包含数百个连接的池。

你可以有两个类来继承你的模型:

class PostgresRecord < ApplicationRecord
self.abstract_class = true
establish_connection POSTGRES_DATABASE
end

class MysqlRecord < ApplicationRecord
self.abstract_class = true
establish_connection MYSQL_DATABASE
end

常量来自初始化器,例如:

POSTGRES_DATABASE = YAML::load( ERB.new( File.read("#{ Rails.root }/config/database.postgres.yml") ).result )[Rails.env.to_s]

在每个 .yml 文件中定义池大小。

https://www.thegreatcodeadventure.com/managing-multiple-databases-in-a-single-rails-application/

您可以为数据库相关文件使用不同的目录,例如迁移模式种子,我为 MySQL 使用默认的“db”,为 Postgres 使用“db_pg”。您还可以设置生成器和 rake 任务:

lib/generators/pg_migration_generator

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

class PgMigrationGenerator < 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_pg/migrate/#{file_name}.rb"
end
end

和 rake 任务:

lib/tasks/pg.rake

desc "Managing the pg database"
task spec: ["pg:db:test:prepare"]

namespace :pg do
desc "Manage database"

namespace :db do |ns|
desc "Pg"

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 ["pg:set_custom_config"] do
Rake::Task["pg:revert_to_original_config"].invoke
end
end
end

task :set_custom_config do
@original_config = {
env_schema: "db/schema.rb",
config: Rails.application.config.dup
}

# set config variables for custom database
ENV['SCHEMA'] = "db_pg/schema.rb"
Rails.application.config.paths['db'] = ["db_pg"]
Rails.application.config.paths['db/migrate'] = ["db_pg/migrate"]
Rails.application.config.paths['db/seeds.rb'] = ["db_pg/seeds.rb"]
Rails.application.config.paths['config/database'] = ["config/database.postgres.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

我正在为 Rails 应用程序构建一个模板,在 Docker 堆栈中开箱即用地支持不同的数据库后端(PG、MySQL、Mongo、Arango...),基本上是一个单一的设置完成整个事情,它很快就会出现在 Github 上。

关于ruby-on-rails - 在 Rails 4 应用程序中使用 MySQL 和 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43801005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com