Connessione a Cassandra in Ruby
In questo articolo vediamo come connetterci ad un db Cassandra in Ruby.
Abbiamo due tabelle identiche:
- in una salviamo tutti gli utenti (utenti_tutti)
- nell'altra solo i maggiorenni (utenti_maggiorenni)
La strutture di entrambe le tabelle è questa:
- id uuid primary key
- email text
- eta int
- nome_completo text
La prima cosa da fare è installare bundler:
gem install bundler
Poi create un file Gemfile dentro la vostra directory con questo dentro:
# frozen_string_literal: true
source "https://rubygems.org"
gem 'cassandra-driver', '~> 3.0'
E date il comando di installazione:
bundle install
Potrebbe cambiare qualcosa a seconda dell'OS che state usando, e di come avete configurato Ruby.
Fatto tutto questo, vi posto un pò di codice:
require 'cassandra'
require 'securerandom'
class Utente
attr_reader :id, :email, :eta, :nome_completo
def initialize(email, eta, nome_completo)
@id = Cassandra::Types::Uuid.new(SecureRandom.uuid)
@email = email
@eta = eta
@nome_completo = nome_completo
end
end
def run_cassandra_example
cluster = nil
session = nil
begin
cluster = Cassandra.cluster(
hosts: ['172.17.0.4'],
load_balancing_policy: Cassandra::LoadBalancing::DCAwareRoundRobin.new('datacenter1')
)
keyspace = 'test_keyspace'
session = cluster.connect(keyspace)
puts "Connesso a Cassandra!"
puts
insert_tutti_cql = "INSERT INTO utenti_tutti (id, email, eta, nome_completo) VALUES (?, ?, ?, ?)"
insert_maggiorenni_cql = "INSERT INTO utenti_maggiorenni (id, email, eta, nome_completo) VALUES (?, ?, ?, ?)"
insert_tutti_stmt = session.prepare(insert_tutti_cql)
insert_maggiorenni_stmt = session.prepare(insert_maggiorenni_cql)
utenti = [
Utente.new("mario.rossi@email.com", 25, "Mario Rossi"),
Utente.new("giulia.verdi@email.com", 30, "Giulia Verdi"),
Utente.new("luca.bianchi@email.com", 16, "Luca Bianchi")
]
puts "=== INSERIMENTO UTENTI ==="
utenti.each do |utente|
params = [utente.id, utente.email, utente.eta, utente.nome_completo]
session.execute(insert_tutti_stmt, arguments: params)
puts "Inserito in utenti_tutti: #{utente.nome_completo} (età #{utente.eta})"
if utente.eta >= 18
session.execute(insert_maggiorenni_stmt, arguments: params)
puts "Inserito in utenti_maggiorenni: #{utente.nome_completo}"
else
puts "NON inserito in utenti_maggiorenni: #{utente.nome_completo} (minorenne)"
end
puts
end
puts "=== QUERY TABELLA: utenti_tutti ==="
count_tutti = query_and_print_results(session, "SELECT * FROM utenti_tutti")
puts "Totale utenti_tutti: #{count_tutti}"
puts
puts "=== QUERY TABELLA: utenti_maggiorenni ==="
count_maggiorenni = query_and_print_results(session, "SELECT * FROM utenti_maggiorenni")
puts "Totale utenti_maggiorenni: #{count_maggiorenni}"
puts
rescue Cassandra::Errors::ClientError => e
puts "Si è verificato un errore di Cassandra: #{e.message}"
rescue StandardError => e
puts "Si è verificato un errore generico: #{e.message}"
ensure
cluster.shutdown if cluster
puts "Connessione chiusa. Operazioni completate."
end
end
def query_and_print_results(session, cql)
results = session.execute(cql)
count = 0
results.each do |row|
puts "ID: #{row['id']}"
puts "Nome: #{row['nome_completo']}"
puts "Email: #{row['email']}"
puts "Età: #{row['eta']}"
puts "---"
count += 1
end
return count
end
run_cassandra_example
Enjoy!
ruby gem cassandra
Commentami!