Querrel facilita la consulta de varias bases de datos en paralelo (subprocesos) utilizando ActiveRecord, como si estuviera consultando una base de datos.
Agregue esta línea al Gemfile de su aplicación:
gem 'querrel'
Y luego ejecuta:
$ bundle
O instálelo usted mismo como:
$ gem install querrel
Puedes usarlo con Querrel directamente a través de su espacio de nombres de nivel superior o creando una instancia:
all_brands = Querrel . query ( Brand . all , on : [ 'db1' , 'db2' , 'db3' ] )
# is the same as
all_brands = Querrel . new ( [ 'db1' , 'db2' , 'db3' ] ) . query ( Brand . all )
Cualquiera de los anteriores le proporcionará una matriz de todos los objetos de Marca de todas las bases de datos proporcionadas. Los registros se marcarán como de solo lectura.
query
producirá un bloque con el ActiveRecord::Relation
pasado, esto le permite realizar operaciones adicionales en los resultados antes de que se fusionen, por ejemplo, podría usar pluck:
all_brand_names = q . query ( Brand . all ) do | s |
s . pluck ( :name )
end
También hay un método run
que, en lugar de ejecutar un alcance preestablecido y fusionarse, tomará un bloque que le permitirá hacer lo que desee con la conexión de base de datos especificada, por ejemplo:
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
Hay tres formas en las que puedes indicarle a Querrel qué bases de datos usar:
Pase en una variedad de entornos, por ejemplo, Querrel.new([:customer1, :customer2])
Pase una serie de nombres de bases de datos, por ejemplo, Querrel.new(['dbs/customer1.sqlite3', 'dbs/customer2.sqlite3'], db_names: true)
Pase un hash de configuraciones de conexión con nombre, por ejemplo:
Querrel . new ( {
one : {
adapter : "sqlite3" ,
database : "test/dbs/test_db_1.sqlite3"
} ,
two : {
adapter : "sqlite3" ,
database : "test/dbs/test_db_2.sqlite3"
}
} )
De forma predeterminada, Querrel utilizará un máximo de 20 subprocesos, pero puedes ajustar esto usando la opción :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
)