rails访问多个数据库
随着Rails 6的发布,宣布的新功能之一是对多个数据库的支持。
当在我们的一个应用程序中,我在努力有效地管理独立的DB时,我大吃一惊。 人们想要这种支持的原因有很多,例如:
- 使用SQL数据库存储用户数据,使用NoSQL存储位置数据
- 有多个SQL数据库来管理单独的应用程序,但是一个应用程序可能需要直接访问另一个数据库
- 管理多个NoSQL和Redis数据库以存储不同种类的数据等
当面对使用多个数据库时,通常,一个充当主服务器,而其他服务器充当从服务器。 因为我是在Rails 6发布之前进行管理的,所以我使用了一种不太理想的方式(读取修补程序/ hacky)来完成此任务。 我为第二个数据库创建了一个单独的YAML文件,用于存储连接信息。 这是一个示例文件:
second_database.yaml
adapter: db_adapter
encoding: db_encoding
pool: db_pool
username: db_username
password: db_password
database: db_name
host: db_host
要访问多个数据库,每次:
- 通过从YAML文件中读取连接信息来建立连接
config = YAML.load_file(second_database.yaml') connection = ActiveRecord::Base.establish_connection( adapter: config[' adapter '], host: config[' host '], database: config[' database '], username: config[' username '], password: config[' password '] )
- 查询数据
employees = connection.execute("SELECT * from employees" )
- 关闭连接
connection.close
真头疼!
但是,发布新的Rails 6时,您可能不必费心(并且可以自己编写代码)来管理多个数据库。
Rails 6启动后,我就升级了我的应用程序,以利用多个数据库支持的好处。 让我们逐步了解升级并为多个数据库进行设置。
- 首先,检查并更新ruby版本至2.5,因为rails 6必须要求ruby 2.5或更高版本。
- 将您的ruby版本升级到2.5或更高版本:
- 在ruby更新期间,可能仅由于版本升级而获得语法错误或弃用警告。
- 请逐步更新Ruby版本-不要直接跳转到最新的Ruby版本; 这会给您带来很多问题。
- 更新到下一个增量版本; 解决错误和警告; 运行并解决测试用例,然后重复该过程。
- 将rails升级到5.2系列的最新版本:
- 由于本文仅涵盖了从导轨5.2到导轨6的升级准则; 请确保您使用的是5.x系列的最新版本。
- 更新Rails 6版本的gemfile:
- 现在该更新Gemfile中的rails版本了。 在您的gem文件中更改rails gem版本。
- 在终端中运行bundle update rails命令以更新rails和其他相关的gem。
- 在终端中运行rails app:update:
- 通过运行此命令,您会发现一些新的配置设置已添加到您的应用程序。 我建议您对每个文件更改使用差异工具选项(d)。
- 取消注释new_framework_defaults_6_0.rb中的默认值:
- 运行迁移:
- 现在,运行bundle install安装剩余的gem,并运行迁移并解决问题(如果有)。
- 运行并修复TestCases:
- 大规模升级之后,让我们测试您的应用程序。 运行您的测试案例; 解决是否有任何失败,并解决弃用警告。
- 启动本地主机并执行手动测试:
- 我建议您对您的应用程序进行一轮手动测试。 赶紧动手,开始手动测试您的应用程序。
- 我建议您对您的应用程序进行一轮手动测试。 赶紧动手,开始手动测试您的应用程序。
宾果游戏 ,现在您可以在Rails 6上运行!
现在,让我们进一步进行使用Rails 6的多个数据库设置。
有了rails 6多数据库支持,您可以拥有多个数据库,并且每个数据库都有一个副本(只读副本)。
现在,考虑具有单个主数据库的Rails应用程序,现在升级到Rails 6之后,您需要为一些新表添加新数据库。 您的database.yml当前版本如下:
带导轨6; 您可以为主数据库添加副本,也可以通过更新database.yml来添加新数据库,如下所示:
考虑将副本用于数据库时需要注意的几点:
- 对于主数据库和副本数据库,数据库名称应该相同,因为两个数据库都包含相同的数据。 使用副本数据库时,您需要添加一个
replica: true
数据库设置为replica: true
。 - 副本数据库和主数据库的用户名应该不同; 主用户将同时具有读取和写入权限,而副本用户将仅具有读取权限; 别写。
- 添加新数据库时,还需要注意迁移路径。 要实现它,您需要如上所述在database.yml文件中添加
migrations_path
设置。 尽管我们有一个副本数据库,但我们没有为其设置迁移路径。
完成此步骤后,您将添加一个新数据库。 现在,让我们为其建立一个模型。 要使用一个新的数据库,您需要向您的应用程序添加一个抽象模型类。 如下所示:
现在您可以访问新数据库了; 现在让我们简要讨论多个数据库功能:
1.主数据库和副本数据库之间的自动连接切换:
要对应用程序使用只读数据库,您需要配置中间件以进行自动连接切换。
自动连接切换使您的应用程序可以基于HTTP请求方法在主数据库和副本数据库之间进行切换。
例如,如果您的应用程序收到POST,PUT,DELETE或PATCH请求,则该应用程序将自动写入主数据库。 并且,对于诸如GET或HEAD之类的请求,应用程序从副本之一读取。
配置中间件以进行自动连接切换; 取消注释或将以下行添加到应用程序配置。
仅当读取请求在我们上面配置的范围内时,Rails才将GET或HEAD请求发送到主请求。 默认情况下,它将设置为2秒。 您可以根据数据库基础结构自由更改它。
2. 在主数据库和副本数据库之间进行手动连接切换:
手动连接到副本数据库或主数据库; rails提供ActiveRecord::Base.connected_to
方法。
有时,无论请求类型如何,您的应用程序都需要连接到主数据库或副本数据库。 在这种情况下,您可以利用ActiveRecord提供的connected_to
方法。
通过使用上面的代码,无论请求类型如何,都可以强制您的应用程序连接到博客的数据库。
现在,此命令使用该连接读取博客数据库的副本并使用它。
Rails 6的多个数据库不支持哪些功能?
他们来了
- 分片
- 副本的负载平衡
- 跨多个数据库联接
我们可以预期这些功能很快就会出现,并可以帮助我们使用Rails 6 super高效地配置,使用和管理多个数据库。
翻译自: https://hackernoon.com/how-to-manage-multiple-databases-in-rails-6-ye6x3ypv
rails访问多个数据库