ruby Rails 7:有条件地连接到不同的数据库

bwntbbo3  于 2023-06-22  发布在  Ruby
关注(0)|答案(1)|浏览(110)

我有一个Rails 7应用程序,我试图有条件地连接到不同的数据库。
下面是database.yml

development:
  primary:
    adapter: postgresql
    database: development
    host: localhost
    user: postgres
    password: root
  main_red:
    adapter: postgresql
    username: etl
    database: "<%= ENV['API_MAIN_DATABASE_NAME'] %>"
    password: "<%= ENV['API_DATABASE_PASSWORD'] %>"
    host: "<%= ENV['API_DATABASE_HOST'] %>"
    database_tasks: false
  main_blue:
    adapter: postgresql
    username: etl
    database: "<%= ENV['API_MAIN_DATABASE_NAME'] %>"
    password: "<%= ENV['API_DATABASE_PASSWORD'] %>"
    host: "<%= ENV['API_DATABASE_HOST'] %>"
    database_tasks: false
  main_green:
    adapter: postgresql
    username: etl
    database: "<%= ENV['API_MAIN_DATABASE_NAME'] %>"
    password: "<%= ENV['API_DATABASE_PASSWORD'] %>"
    host: "<%= ENV['API_DATABASE_HOST'] %>"
    database_tasks: false

下面是模型定义

class ExternalRecord < ApplicationRecord
  self.abstract_class = true
  #establish_connection :main
  connects_to database: {main_red: :main_red, main_green: :main_green, main_blue: :main_blue}
end

我想从main_red, main_green or main_blue中执行读取,并在primary数据库中执行插入。
下面是我的代码

ActiveRecord::Base.connected_to(role: :main_red) do
            result = Api::V2::BulkExport.where(Tier: @tier, Version: 'v2').order(order).ransack(@params[:q]).result.limit(@limit)
          end
track_usage(user_id: @user.id, end_point: request.path, rows_returned: result.count)

从数据库的阅读按预期工作,但看起来我无法连接回主数据库。我看到以下错误

ActiveRecord::ConnectionNotEstablished (No connection pool for 'ExternalRecord' found.):

任何帮助这将是伟大的,谢谢。

c7rzv4ha

c7rzv4ha1#

在您的代码中,您使用connects_to方法建立到不同数据库的连接。但是,在尝试连接回主数据库时,您似乎遇到了问题。
若要解决ActiveRecord::ConnectionNotEstablished错误,需要在执行需要主连接的代码之前显式建立到主数据库的连接。
可以按如下方式修改代码:

ActiveRecord::Base.connected_to(role: :main_red) do
  result = Api::V2::BulkExport.where(Tier: @tier, Version: 'v2').order(order).ransack(@params[:q]).result.limit(@limit)

  ActiveRecord::Base.connected_to(role: :primary) do
    track_usage(user_id: @user.id, end_point: request.path, rows_returned: result.count)
  end
end

在修改后的代码中,外部块建立到main_red数据库的连接并执行查询。然后,在块中建立到主数据库的连接并执行插入。
通过在main_red连接块中显式地建立到主数据库的连接,您应该能够避免ActiveRecord::ConnectionNotEstablished错误并成功执行插入操作。

相关问题