随着Rails 6的发布,宣布的新功能之一是对多个数据库的支持。那么如何在Rails 6中管理多个数据库?当我们在一个应用程序中,努力有效地管理独立的DB时,会让你大吃一惊。人们想要Rails 6支持多个数据库的原因有很多,使用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更新期间,可能仅由于版本升级而获得语法错误或弃用警告。
请逐步更新红宝石版本-不要直接跳转到最新的红宝石版本;这会给您带来很多问题。
更新到下一个增量版本;解决错误和警告;运行并解决测试用例,然后重复该过程。
将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应用程序,现在升级到Rails 6之后,您需要为一些新表添加新数据库。您的database.yml当前版本如下:
带导轨6;您可以为主数据库添加副本,也可以通过更新database.yml来添加新数据库,如下所示:
考虑将副本用于数据库时需要注意的几点:
.对于主数据库和副本数据库,数据库名称应该相同,因为两个数据库都包含相同的数据。使用副本数据库时,您需要添加一个replica: true 数据库设置。
.副本数据库和主数据库的用户名应该不同;主用户将同时具有读取和写入权限,而副本用户将仅具有读取权限别写。
.添加新数据库时,还需要注意迁移路径。要实现它,您需要添加migrations_path如上所示,在database.yml文件中进行设置。尽管我们有一个副本数据库,但我们没有为其设置迁移路径。
完成此步骤后,您将添加一个新数据库。现在,让我们为其建立一个模型。要使用一个新的数据库,您需要向您的应用程序添加一个抽象模型类。如下所示:
现在您可以访问新数据库了;现在让我们简要讨论多个数据库功能:
1.主数据库和副本数据库之间的自动连接切换:
要对应用程序使用只读数据库,您需要配置中间件以进行自动连接切换。
自动连接切换使您的应用程序可以基于HTTP请求方法在主数据库和副本数据库之间进行切换。
例如,如果您的应用程序收到POST,PUT,DELETE或PATCH请求,则该应用程序将自动写入主数据库。并且,对于诸如GET或HEAD之类的请求,应用程序从副本之一读取。
配置中间件以进行自动连接切换;取消注释或将以下行添加到应用程序配置。
仅当读取请求在我们上面配置的范围内时,Rails才将GET或HEAD请求发送到主请求。默认情况下,它将设置为2秒。您可以根据数据库基础结构自由更改它。
2. 在主数据库和副本数据库之间进行手动连接切换:
手动连接到副本数据库或主数据库;轨道提供ActiveRecord::Base.connected_to 方法。
有时,无论请求类型如何,您的应用程序都需要连接到主数据库或副本数据库。在这种情况下,您可以利用connected_to ActiveRecord提供的方法。
通过使用上面的代码,无论请求类型如何,都可以强制您的应用程序连接到博客的数据库。
现在,此命令使用该连接读取博客数据库的副本并使用它。
Rails 6的多个数据库不支持哪些功能?
.分片
.副本的负载平衡
.跨多个数据库联接
我们可以预期这些功能很快就会出现,并可以帮助我们使用Rails 6 super高效地配置,使用和管理多个数据库。
好了,关于如何在Rails 6中管理多个数据库的信息,介绍到这里就结束了,想了解更多关于数据库的信息,请继续关注中培伟业。