ruby-on-rails Rails中的多个数据库

pbgvytdp  于 5个月前  发布在  Ruby
关注(0)|答案(9)|浏览(89)

这可以做到吗?在单个应用程序中,使用SQLite管理多个项目。我想要的是为我的应用程序管理的每个项目使用不同的数据库..因此,具有相同结构的数据库的多个副本,但其中包含不同的数据。我将根据URI上的参数选择使用哪个副本。
这是为了1.安全..我是一个newbe在这种编程,我不希望它发生,由于某种原因,而在一个项目工作的另一个被损坏.. 2.容易备份和旧项目存档

w1jd8yoj

w1jd8yoj1#

默认情况下,Rails不是为多数据库架构设计的,在大多数情况下,它根本没有意义。但是,是的,你可以使用不同的数据库和连接。
以下是一些参考资料:

3okqufwl

3okqufwl2#

如果您能够控制和配置每个Rails示例,并且您可以承受由于它们处于待机状态而浪费的资源,那么只需更改database.yml来修改每个示例上使用的数据库连接即可,这样可以节省保存一些麻烦。如果您担心性能,这种方法不会解决问题。
对于只绑定到一个数据库上的单个唯一表的模型,您可以在模型内部调用establish_connection:

establish_connection "database_name_#{RAILS_ENV}"

字符串
如下所述:http://apidock.com/rails/ActiveRecord/Base/establish_connection/class
您将有一些模型使用来自一个数据库的表,而其他不同的模型使用来自其他数据库的表。
如果你有相同的表,在不同的数据库中通用,并且由一个模型共享,ActiveRecord不会帮助你。早在2009年,我在一个项目中需要这个,我使用Rails 2.3.8。我为每个客户都有一个数据库,我用他们的ID命名数据库。所以我创建了一个方法来改变ApplicationController中的连接:

def change_database database_id = params[:company_id]
    return if database_id.blank?

    configuration = ActiveRecord::Base.connection.instance_eval { @config }.clone
    configuration[:database] = "database_name_#{database_id}_#{RAILS_ENV}"

    MultipleDatabaseModel.establish_connection configuration
end


并将该方法作为 before_filter 添加到所有控制器:

before_filter :change_database


因此,对于每个控制器的每个操作,当定义和设置params[:company_id]时,它将把数据库更改为正确的数据库。
为了处理迁移,我扩展了ActiveRecord::Migration,使用一个方法来查找所有客户并使用每个ID迭代一个块:

class ActiveRecord::Migration
    def self.using_databases *args
        configuration = ActiveRecord::Base.connection.instance_eval { @config }
        former_database = configuration[:database]

        companies = args.blank? ? Company.all : Company.find(args)

        companies.each do |company|
            configuration[:database] = "database_name_#{company[:id]}_#{RAILS_ENV}"
            ActiveRecord::Base.establish_connection configuration

            yield self
        end

        configuration[:database] = former_database
        ActiveRecord::Base.establish_connection configuration
    end
end


请注意,这样做,你就不可能在同一个操作中从两个不同的数据库进行查询。你可以再次调用 change_database,但是当你试图使用从不再链接到正确数据库的对象执行查询的方法时,它会变得很糟糕。而且,很明显,你将无法连接属于不同数据库的表。
为了正确处理这个问题,ActiveRecord应该进行相当大的扩展。现在应该有一个插件来帮助你解决这个问题。快速研究给了我这个:
DB-Charmer:http://kovyrin.github.com/db-charmer/
我愿意试试。告诉我什么对你有效。

to94eoyn

to94eoyn3#

我通过使用另一个数据库将其添加到模型的顶部来解决这个问题

class Customer < ActiveRecord::Base
  ENV["RAILS_ENV"] == "development" ? host = 'devhost' : host = 'prodhost'

  self.establish_connection(
      :adapter  => "mysql",
      :host     => "localhost",
      :username => "myuser",
      :password => "mypass",
      :database => "somedatabase"
    )

字符串

zour9fqk

zour9fqk4#

您还应该查看这个名为DB Charmer:http://kovyrin.net/2009/11/03/db-charmer-activerecord-connection-magic-plugin/的项目
DbCharmer是一个简单而强大的ActiveRecord插件,它可以做一些事情:
1.允许您轻松管理AR模型的连接(switch_connection_to方法)
1.允许您将AR模型的默认连接切换到单独的服务器/数据库
1.允许您轻松地选择查询的位置(on_*方法家族)
1.允许您自动发送读取查询到您的从,而主将处理所有的更新。
1.将多个数据库迁移添加到ActiveRecord

ljo96ir5

ljo96ir55#

从Rails 6开始,支持多个数据库:https://guides.rubyonrails.org/active_record_multiple_databases.html#generators-and-migrations
很抱歉,这个答案很晚才给出,但我认为它是可行的,因为它现在已经得到了支持。

olhwl3o2

olhwl3o26#

值得注意的是,在所有这些解决方案中,你都需要记住关闭自定义数据库连接。否则,你会 * 用完连接,并看到奇怪的请求超时问题。
一个简单的解决方案是在控制器的after_filter中清除_active_connections!。

after_filter :close_custom_db_connection

def close_custom_db_connection
  MyModelWithACustomDBConnection.clear_active_connections!
end

字符串

iqjalb3h

iqjalb3h7#

在您config/database.yml中执行以下操作

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5

development:
  <<: *default
  database: mysite_development

test:
  <<: *default
  database: mysite_test

production:
  <<: *default
  host: 10.0.1.55
  database: mysite_production
  username: postgres_user
  password: <%= ENV['DATABASE_PASSWORD'] %>

db2_development:
  <<: *default
  database: db2_development

db2_test:
  <<: *default
  database: db2_test

db2_production:
  <<: *default
  host: 10.0.1.55
  database: db2_production
  username: postgres_user
  password: <%= ENV['DATABASE_PASSWORD'] %>

字符串
那么在模型中,您可以使用

class Customers < ActiveRecord::Base
  establish_connection "db2_#{Rails.env}".to_sym
end

o2rvlv0m

o2rvlv0m8#

你在问题中描述的是多租户(每个数据库中有不同数据的相同结构的数据库)。
对于Rails中多个数据库的一般问题:ActiveRecord支持多个数据库,但Rails没有提供管理它们的方法。

rt4zxlrg

rt4zxlrg9#

目前为止我找到的最好的解决方案是:

我们可以采用三种数据库架构。

  • 单一租户的单一数据库
  • 每个租户的单独架构
  • 租户的共享架构

注意:它们有一定的优点和缺点,这取决于你的用例。
我从这个Blog得到这个!对我很有帮助。
您可以使用gem Apartment for rails
您可以在Gorails for apartment上观看视频参考

相关问题