简体   繁体   English

Rails中的多个数据库连接

[英]Multiple database connection in Rails

I'm using active_delegate for multiple connection in Rails. 我正在使用active_delegate在Rails中进行多个连接。 Here I'm using mysql as master_database for some models,and postgresql for some other models. 这里我使用mysql作为master_database用于某些模型,而postgresql用于其他一些模型。

Problem is that when I try to access the mysql models, I'm getting the error below! 问题是,当我尝试访问mysql模型时,我收到以下错误! Stack trace shows that, it is still using the postgresql adapter to access my mysql models! 堆栈跟踪显示,它仍然使用postgresql适配器来访问我的mysql模型!

RuntimeError: ERROR C42P01  Mrelation "categories" does not exist   P15 F.\src\backend\parser\parse_relation.c  L886    RparserOpenTable: SELECT * FROM "categories" 

STACKTRACE
===========
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract_adapter.rb:212:in `log'
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/postgresql_adapter.rb:507:in `execute'
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/postgresql_adapter.rb:985:in `select_raw'
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/postgresql_adapter.rb:972:in `select'
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in `select_all_without_query_cache'
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/query_cache.rb:60:in `select_all'
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/query_cache.rb:81:in `cache_sql'
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/query_cache.rb:60:in `select_all'
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:661:in `find_by_sql'
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:1553:in `find_every'
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:615:in `find'
D:/ROR/Aptana/dedomenon/app/models/category.rb:50:in `get_all_with_exclusive_scope'
D:/ROR/Aptana/dedomenon/app/models/category.rb:50:in `get_all_with_exclusive_scope'
D:/ROR/Aptana/dedomenon/app/controllers/categories_controller.rb:48:in `index'

here is my database.yml file 这是我的database.yml文件

postgre: &postgre
  adapter: postgresql
  database: codex
  host: localhost
  username: postgres
  password: root
  port: 5432  

mysql: &mysql
  adapter: mysql
  database: project
  host: localhost
  username: root
  password: root
  port: 3306  

development:
  <<: *postgre

test:
  <<: *postgre

production:
  <<: *postgre

master_database:
  <<: *mysql

and my master_database model is like this 我的master_database模型是这样的

class Category < ActiveRecord::Base

  delegates_connection_to :master_database, :on => [:create, :save, :destroy]

end

Anyone has any solution?? 有人有任何解决方案?

Another way: 其他方式:

class Abc < ActiveRecord::Base
  establish_connection Rails.configuration.database_configuration["test"]
end

现在可能想看看https://github.com/tchandy/octopus

This will change the database connection for a single model object. 这将更改单个模型对象的数据库连接。

$config = YAML.load_file(File.join(File.dirname(__FILE__),
   '../config/database.yml'))

class ModelWithDifferentConnection < ActiveRecord::Base
  establish_connection $config['connection_name_from_database_yml']
end

If you are using the same server but just a different database file then you can do something like this instead. 如果您使用相同的服务器但只使用不同的数据库文件,那么您可以执行类似的操作。

class ModelWithDifferentConnection < ActiveRecord::Base

  # Lives in the CURRICULUM database
  def self.table_name
    "database.table"
  end

end

I highly suggest MyReplication plugin for MySQL adapter which helps you switch the connection at run-time in an elegant way: 我强烈建议使用MySQL适配器的MyReplication插件,它可以帮助您以优雅的方式在运行时切换连接:

User.using(:another_database) do
  u = User.all
end

https://github.com/minhnghivn/my_replication https://github.com/minhnghivn/my_replication

I tried ur Sample,still getting error!! 我试过你的Sample,仍然收到错误!!

superclass mismatch for class MysqlAdapter

I think ,the problem is with my database.yml file .Please check this file 我想,问题出在我的database.yml文件中。请检查此文件

database_mysql: 
  adapter: mysql
  database: project
  host: localhost
  username: root
  password: root
  port: 3306  

development:
  adapter: postgresql
  database: codex
  host: localhost
  username: postgres
  password: root
  port: 5432  

test:
  adapter: postgresql
  database: codex
  host: localhost
  username: postgres
  password: root
  port: 5432  

production:
  adapter: postgresql
  database: codex
  host: localhost
  username: postgres
  password: root
  port: 5432  

i start the mongrel in developemnet mode only. 我只在开发模式下启动杂种。

here is my model superclass 这是我的模型超类

$config = YAML.load_file(File.join(File.dirname(__FILE__),
   '../../config/database.yml'))

class MasterDatabase < ActiveRecord::Base
    self.abstract_class = true
    establish_connection $config['database_mysql']    
end 

Please correct me.. 请纠正我..

我还必须连接并管理两个不同的数据库,所以我创建了一个名为secondbase的gem: http ://github.com/karledurante/secondbase

I don't know about active_delegate, but I recently had to access different databases for work applications, and nothing really fit what I wanted. 我不知道active_delegate,但我最近不得不访问工作应用程序的不同数据库,并没有什么真正适合我想要的。 So I wrote something for myself, it's running in production applications as we speak. 所以我为自己写了一些东西,它就像我们说的那样在生产应用程序中运行。

Fixed Link connection_ninja 固定链接connection_ninja

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM