Connessione a Cassandra in Scala con DataStax OSS

Mattepuffo's logo
Connessione a Cassandra in Scala con DataStax OSS

Connessione a Cassandra in Scala con DataStax OSS

In questo articolo vediamo come connetterci ad un db Cassandra in Scala usando un driver specifico: DataStax OSS.

Nello specifico Scala 3.

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

Se usate sbt:

libraryDependencies ++= Seq(
  "com.datastax.oss" % "java-driver-core" % "4.17.0"
)

Qui sotto un pò di codice:

package org.example

import com.datastax.oss.driver.api.core.CqlSession
import scala.jdk.FutureConverters.*
import scala.jdk.CollectionConverters.*
import java.net.InetSocketAddress
import java.util.UUID
import scala.concurrent.Await
import scala.concurrent.duration.DurationInt

case class Utente(email: String, eta: Int, nomeCompleto: String, id: UUID = UUID.randomUUID())

@main
def main(): Unit = {
  val session = CqlSession.builder()
    .addContactPoint(new InetSocketAddress("172.17.0.5", 9042))
    .withLocalDatacenter("datacenter1")
    .withKeyspace("test_keyspace")
    .build()

  try {
    println("Connesso a Cassandra con Scala 3!")

    val insertTuttiStmt = session.prepare(
      "INSERT INTO utenti_tutti (id, email, eta, nome_completo) VALUES (?, ?, ?, ?)"
    )

    val insertMaggiorenniStmt = session.prepare(
      "INSERT INTO utenti_maggiorenni (id, email, eta, nome_completo) VALUES (?, ?, ?, ?)"
    )

    val utenti = List(
      Utente("mario.rossi@email.com", 25, "Mario Rossi"),
      Utente("giulia.verdi@email.com", 30, "Giulia Verdi"),
      Utente("luca.bianchi@email.com", 16, "Luca Bianchi")
    )

    println("=== INSERIMENTO UTENTI ===")

    for (u <- utenti) do {
      val f1 = session.executeAsync(insertTuttiStmt.bind(u.id, u.email, u.eta: java.lang.Integer, u.nomeCompleto))
        .asScala

      Await.result(f1, 5.seconds)
      println(s"Inserito in utenti_tutti: ${u.nomeCompleto}")

      if u.eta >= 18 then {
        val f2 = session.executeAsync(insertMaggiorenniStmt.bind(u.id, u.email, u.eta: java.lang.Integer, u.nomeCompleto))
          .asScala
        Await.result(f2, 5.seconds)
        println(s"Inserito in utenti_maggiorenni: ${u.nomeCompleto}")
      } else {
        println(s"NON inserito: ${u.nomeCompleto} (minorenne)")
      }
    }

    println("=== RISULTATI: utenti_tutti ===")
    queryAndPrint(session, "SELECT * FROM utenti_tutti")

    println("=== RISULTATI: utenti_maggiorenni ===")
    queryAndPrint(session, "SELECT * FROM utenti_maggiorenni")
  } finally {
    session.close()
    println("Sessione chiusa")
  }
}

def queryAndPrint(session: CqlSession, cql: String): Unit =
  val rs = session.execute(cql)

  for row <- rs.asScala do {
    println(s"ID: ${row.getUuid("id")} | Nome: ${row.getString("nome_completo")} | Età: ${row.getInt("eta")}")
    println("---")
  }

Enjoy!


Condividi

Commentami!