允许基于url参数的动态数据库



我有一个Rails应用程序(目前为6.1,但如果需要,我可以轻松升级它(,该应用程序连接到外部MSSQL数据库,并为数据提供API(只读(。

我使用这些宝石来帮助我访问数据库:

gem 'activerecord-sqlserver-adapter', '6.1.2'
gem 'composite_primary_keys', '13.0.0'
gem 'tiny_tds', '2.1.5'

我有许多这样的MSSQL数据库,它们具有相同的表/视图,但连接到不同的数据源,我使用这个应用程序可以从这些数据库创建API。

现在,我能做的一个快速设置破解是:

  1. 创建子域(例如db1.domain.com、db2.domain.com(

  2. 在我的数据库中创建多个数据库。yml:

db1:
<<: *default
database: db2
db1:
<<: *default
database: db1
  1. 为每个数据库创建环境配置

  2. 在服务器上启动一个应用程序,捕获子域并将RAILS_ENV设置为db1和db2

这很好用,但不是动态的!最初的2-3次都很好,但我们现在有20多个数据库,我不希望每个新数据库都必须连续手动完成。

我希望domain.com/db1和domain.com/db2能够动态地知道数据库是db1和db2,即使应用程序中没有更改任何代码,服务器中也没有新的应用程序。

我知道Rails现在支持多个数据库,但我上次尝试MSSQL时(就在它发布的时候(无法弄清楚。

我将再次深入研究这一点,但不知道这里是否有人对我有过类似的经历或建议。

非常感谢任何提示、技巧或建议!

感谢

如果有人遇到类似的问题,我从SO的回答中得到了一些启发,很容易就解决了这个问题。

首先,我用scope '/:db_key' do将所有路由封装在一个范围内。(In routes.rb(

然后在app/controllers/application_controller.rb中,我根据密钥添加了一个到数据库的连接(因为在我的情况下,除了密钥之外,所有数据库信息都是相同的,我只需要修改密钥,但你可以很容易地编辑任何字段(:

class ApplicationController < ActionController::API
before_action :setup_db_connection
...
private
def setup_db_connection
# connect to the database with the name of the database key
@setup_db_connection ||= ActiveRecord::Base.establish_connection(
Rails.application.credentials.db.to_h.merge(database: params[:db_key])
)
end
end

在rails凭据中,我列出了所有数据库凭据:

db:
host: xxxxx
localhost: xxxxxx
port: xxxx
username: user
password: reallyStrongPassword
database: have_the_default_db_here_but_its_not_needed_since_i_replace_it
adapter: sqlserver
encoding: utf8
mode: dblib
reconnect: true
timeout: 350000

由于没有迁移,我只是从外部数据库中读取,我不需要database.yml中的任何特殊数据库,也不需要每个数据库更多的rails-env。

我知道这是一种非常独特的情况,因为我连接到其他数据库,这些数据库每个帐户都有不同的数据库名称,但具有完全相同的模式,并且不需要编写。但发布这个以防它帮助了其他人,或者给了另一个开发者一些灵感。

相关内容

  • 没有找到相关文章

最新更新