Connessione a Cassandra in Ruby

Mattepuffo's logo
Connessione a Cassandra in Ruby

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!


Condividi

Commentami!