Querrel facilite l'interrogation de plusieurs bases de données en parallèle (threads) à l'aide d'ActiveRecord, comme si vous interrogeiez une seule base de données.
Ajoutez cette ligne au Gemfile de votre application :
gem 'querrel'
Et puis exécutez :
$ bundle
Ou installez-le vous-même en tant que :
$ gem install querrel
Vous pouvez utiliser Querrel directement via son espace de noms de niveau supérieur ou en créant une instance :
all_brands = Querrel . query ( Brand . all , on : [ 'db1' , 'db2' , 'db3' ] )
# is the same as
all_brands = Querrel . new ( [ 'db1' , 'db2' , 'db3' ] ) . query ( Brand . all )
L'une ou l'autre des solutions ci-dessus vous donnera un tableau de tous les objets Brand de toutes les bases de données données. Les enregistrements seront marqués en lecture seule.
query
produira un bloc avec le passé dans ActiveRecord::Relation
, cela vous permettra d'effectuer des opérations supplémentaires sur les résultats avant qu'ils ne soient fusionnés, par exemple vous pouvez utiliser pluck :
all_brand_names = q . query ( Brand . all ) do | s |
s . pluck ( :name )
end
Il existe également une méthode run
qui, au lieu d'exécuter une portée prédéfinie et de fusionner, prendra un bloc qui vous permettra de faire tout ce que vous voulez avec la connexion à la base de données spécifiée, par exemple :
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
Il existe trois manières de demander à Querrel quelles bases de données utiliser :
Transmettez dans un éventail d'environnements, par exemple Querrel.new([:customer1, :customer2])
Transmettez un tableau de noms de bases de données, par exemple Querrel.new(['dbs/customer1.sqlite3', 'dbs/customer2.sqlite3'], db_names: true)
Transmettez un hachage de configurations de connexion nommées, par exemple :
Querrel . new ( {
one : {
adapter : "sqlite3" ,
database : "test/dbs/test_db_1.sqlite3"
} ,
two : {
adapter : "sqlite3" ,
database : "test/dbs/test_db_2.sqlite3"
}
} )
Par défaut, Querrel utilisera un maximum de 20 threads, mais vous pouvez ajuster cela en utilisant l'option :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
)