Querrel erleichtert die parallele Abfrage mehrerer Datenbanken (Threads) mithilfe von ActiveRecord, als ob Sie eine Datenbank abfragen würden.
Fügen Sie diese Zeile zur Gemfile Ihrer Anwendung hinzu:
gem 'querrel'
Und dann ausführen:
$ bundle
Oder installieren Sie es selbst als:
$ gem install querrel
Sie können Querrel direkt über seinen Top-Level-Namespace oder durch Erstellen einer Instanz verwenden:
all_brands = Querrel . query ( Brand . all , on : [ 'db1' , 'db2' , 'db3' ] )
# is the same as
all_brands = Querrel . new ( [ 'db1' , 'db2' , 'db3' ] ) . query ( Brand . all )
Mit beiden oben genannten Optionen erhalten Sie ein Array aller Markenobjekte aus allen angegebenen Datenbanken. Die Datensätze werden als schreibgeschützt markiert.
query
ergibt einen Block mit dem in ActiveRecord::Relation
übergebenen Wert. Auf diese Weise können Sie zusätzliche Operationen an den Ergebnissen durchführen, bevor sie zusammengeführt werden. Sie können beispielsweise pluck verwenden:
all_brand_names = q . query ( Brand . all ) do | s |
s . pluck ( :name )
end
Es gibt auch eine run
, die, anstatt einen vorgegebenen Bereich auszuführen und zusammenzuführen, einen Block verwendet, der es Ihnen ermöglicht, mit der angegebenen Datenbankverbindung alles zu tun, was Sie wollen, zum Beispiel:
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
Es gibt drei Möglichkeiten, Querrel anzuweisen, welche Datenbanken verwendet werden sollen:
Übergeben Sie ein Array von Umgebungen, z. B. Querrel.new([:customer1, :customer2])
Übergeben Sie ein Array von Datenbanknamen, z. B. Querrel.new(['dbs/customer1.sqlite3', 'dbs/customer2.sqlite3'], db_names: true)
Übergeben Sie einen Hash benannter Verbindungskonfigurationen, z. B.:
Querrel . new ( {
one : {
adapter : "sqlite3" ,
database : "test/dbs/test_db_1.sqlite3"
} ,
two : {
adapter : "sqlite3" ,
database : "test/dbs/test_db_2.sqlite3"
}
} )
Standardmäßig verwendet Querrel maximal 20 Threads, Sie können dies jedoch mit der Option :threads
anpassen:
q = Querrel . new ( dbs , threads : 50 )
git checkout -b my-new-feature
)git commit -am 'Add some feature'
)git push origin my-new-feature
)