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!
scala sbt cassandra
Commentami!