6 Stimmen

Mehrere Datenbankverbindungen in Rails

Ich bin mit active_delegate für mehrere Verbindung in Rails. Hier verwende ich mysql als master_database für einige Modelle, und postgresql für einige andere Modelle.

Das Problem ist, dass ich, wenn ich versuche, auf die mysql-Modelle zuzugreifen, die folgende Fehlermeldung erhalte! Der Stack-Trace zeigt, dass immer noch der Postgresql-Adapter verwendet wird, um auf meine Mysql-Modelle zuzugreifen!

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'

hier ist mein database.yml Datei

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

und mein master_database Das Modell sieht folgendermaßen aus

class Category < ActiveRecord::Base

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

end

Hat jemand eine Lösung?

11voto

Hoang Tran Punkte 309

Eine andere Möglichkeit:

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

5voto

Steven Soroka Punkte 18749

Sollten Sie sich vielleicht ansehen https://github.com/tchandy/octopus Heutzutage.

4voto

Ken Punkte 2064

Dadurch wird die Datenbankverbindung für ein einzelnes Modellobjekt geändert.

$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

Wenn Sie denselben Server, aber eine andere Datenbankdatei verwenden, können Sie stattdessen etwas wie folgt tun.

class ModelWithDifferentConnection < ActiveRecord::Base

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

end

2voto

Napoleon Punkte 21

Ich empfehle dringend MyReplication Plugin für den MySQL-Adapter, mit dem Sie die Verbindung zur Laufzeit auf elegante Weise umschalten können:

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

https://github.com/minhnghivn/my_replication

1voto

Ich habe dein Sample ausprobiert, bekomme aber immer noch einen Fehler!!

superclass mismatch for class MysqlAdapter

Ich denke, das Problem liegt bei meinem database.yml Bitte überprüfen Sie diese Datei.

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  

Ich starte den Mongrel nur im Entwicklungsmodus.

Hier ist meine Modell-Superklasse

$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 

Bitte korrigieren Sie mich..

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X