这可以做到吗?在单个应用程序中,使用SQLite管理多个项目。我想要的是为我的应用程序管理的每个项目使用不同的数据库..因此,具有相同结构的数据库的多个副本,但其中包含不同的数据。我将根据URI上的参数选择使用哪个副本。这是为了1.安全..我是一个newbe在这种编程,我不希望它发生,由于某种原因,而在一个项目工作的另一个被损坏.. 2.容易备份和旧项目存档
w1jd8yoj1#
默认情况下,Rails不是为多数据库架构设计的,在大多数情况下,它根本没有意义。但是,是的,你可以使用不同的数据库和连接。以下是一些参考资料:
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/我愿意试试。告诉我什么对你有效。
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" )
字符串
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
switch_connection_to
on_*
ljo96ir55#
从Rails 6开始,支持多个数据库:https://guides.rubyonrails.org/active_record_multiple_databases.html#generators-and-migrations很抱歉,这个答案很晚才给出,但我认为它是可行的,因为它现在已经得到了支持。
olhwl3o26#
值得注意的是,在所有这些解决方案中,你都需要记住关闭自定义数据库连接。否则,你会 * 用完连接,并看到奇怪的请求超时问题。一个简单的解决方案是在控制器的after_filter中清除_active_connections!。
after_filter :close_custom_db_connection def close_custom_db_connection MyModelWithACustomDBConnection.clear_active_connections! end
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
型
o2rvlv0m8#
你在问题中描述的是多租户(每个数据库中有不同数据的相同结构的数据库)。对于Rails中多个数据库的一般问题:ActiveRecord支持多个数据库,但Rails没有提供管理它们的方法。
rt4zxlrg9#
目前为止我找到的最好的解决方案是:
我们可以采用三种数据库架构。
注意:它们有一定的优点和缺点,这取决于你的用例。我从这个Blog得到这个!对我很有帮助。您可以使用gem Apartment for rails您可以在Gorails for apartment上观看视频参考
9条答案
按热度按时间w1jd8yoj1#
默认情况下,Rails不是为多数据库架构设计的,在大多数情况下,它根本没有意义。但是,是的,你可以使用不同的数据库和连接。
以下是一些参考资料:
3okqufwl2#
如果您能够控制和配置每个Rails示例,并且您可以承受由于它们处于待机状态而浪费的资源,那么只需更改database.yml来修改每个示例上使用的数据库连接即可,这样可以节省保存一些麻烦。如果您担心性能,这种方法不会解决问题。
对于只绑定到一个数据库上的单个唯一表的模型,您可以在模型内部调用establish_connection:
字符串
如下所述:http://apidock.com/rails/ActiveRecord/Base/establish_connection/class
您将有一些模型使用来自一个数据库的表,而其他不同的模型使用来自其他数据库的表。
如果你有相同的表,在不同的数据库中通用,并且由一个模型共享,ActiveRecord不会帮助你。早在2009年,我在一个项目中需要这个,我使用Rails 2.3.8。我为每个客户都有一个数据库,我用他们的ID命名数据库。所以我创建了一个方法来改变ApplicationController中的连接:
型
并将该方法作为 before_filter 添加到所有控制器:
型
因此,对于每个控制器的每个操作,当定义和设置params[:company_id]时,它将把数据库更改为正确的数据库。
为了处理迁移,我扩展了ActiveRecord::Migration,使用一个方法来查找所有客户并使用每个ID迭代一个块:
型
请注意,这样做,你就不可能在同一个操作中从两个不同的数据库进行查询。你可以再次调用 change_database,但是当你试图使用从不再链接到正确数据库的对象执行查询的方法时,它会变得很糟糕。而且,很明显,你将无法连接属于不同数据库的表。
为了正确处理这个问题,ActiveRecord应该进行相当大的扩展。现在应该有一个插件来帮助你解决这个问题。快速研究给了我这个:
DB-Charmer:http://kovyrin.github.com/db-charmer/
我愿意试试。告诉我什么对你有效。
to94eoyn3#
我通过使用另一个数据库将其添加到模型的顶部来解决这个问题
字符串
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
ljo96ir55#
从Rails 6开始,支持多个数据库:https://guides.rubyonrails.org/active_record_multiple_databases.html#generators-and-migrations
很抱歉,这个答案很晚才给出,但我认为它是可行的,因为它现在已经得到了支持。
olhwl3o26#
值得注意的是,在所有这些解决方案中,你都需要记住关闭自定义数据库连接。否则,你会 * 用完连接,并看到奇怪的请求超时问题。
一个简单的解决方案是在控制器的after_filter中清除_active_connections!。
字符串
iqjalb3h7#
在您config/database.yml中执行以下操作
字符串
那么在模型中,您可以使用
型
o2rvlv0m8#
你在问题中描述的是多租户(每个数据库中有不同数据的相同结构的数据库)。
对于Rails中多个数据库的一般问题:ActiveRecord支持多个数据库,但Rails没有提供管理它们的方法。
rt4zxlrg9#
目前为止我找到的最好的解决方案是:
我们可以采用三种数据库架构。
注意:它们有一定的优点和缺点,这取决于你的用例。
我从这个Blog得到这个!对我很有帮助。
您可以使用gem Apartment for rails
您可以在Gorails for apartment上观看视频参考