Querrel facilita a consulta de vários bancos de dados em paralelo (threads) usando ActiveRecord, como se você estivesse consultando um banco de dados.
Adicione esta linha ao Gemfile da sua aplicação:
gem 'querrel'
E então execute:
$ bundle
Ou instale você mesmo como:
$ gem install querrel
Você pode usar o Querrel diretamente por meio de seu namespace de nível superior ou criando uma instância:
all_brands = Querrel . query ( Brand . all , on : [ 'db1' , 'db2' , 'db3' ] )
# is the same as
all_brands = Querrel . new ( [ 'db1' , 'db2' , 'db3' ] ) . query ( Brand . all )
Qualquer uma das opções acima fornecerá uma matriz de todos os objetos Brand de todos os bancos de dados fornecidos. Os registros serão marcados como somente leitura.
query
produzirá um bloco com o passado em ActiveRecord::Relation
, isso permite que você faça operações adicionais nos resultados antes de serem mesclados, por exemplo, você pode usar pluck:
all_brand_names = q . query ( Brand . all ) do | s |
s . pluck ( :name )
end
Há também um método run
que, em vez de executar um escopo pré-prescrito e mesclar, usará um bloco que permite fazer o que quiser com a conexão de banco de dados especificada, por exemplo:
require 'thread'
all_brands = [ ]
b_s = Mutex . new
all_products = [ ]
p_s = Mutex . new
Querrel . run ( on : dbs ) do | db |
b_s . synchronize { all_brands += Brand . all . to_a }
p_s . synchronize { all_products += Product . all . to_a }
end
Existem três maneiras pelas quais você pode instruir Querrel quais bancos de dados usar:
Passe uma variedade de ambientes, por exemplo Querrel.new([:customer1, :customer2])
Passe uma matriz de nomes de banco de dados, por exemplo Querrel.new(['dbs/customer1.sqlite3', 'dbs/customer2.sqlite3'], db_names: true)
Passe um hash de configurações de conexão nomeadas, por exemplo:
Querrel . new ( {
one : {
adapter : "sqlite3" ,
database : "test/dbs/test_db_1.sqlite3"
} ,
two : {
adapter : "sqlite3" ,
database : "test/dbs/test_db_2.sqlite3"
}
} )
Por padrão, o Querrel usará no máximo 20 threads, mas você pode ajustar isso usando a opção :threads
:
q = Querrel . new ( dbs , threads : 50 )
git checkout -b my-new-feature
)git commit -am 'Add some feature'
)git push origin my-new-feature
)