Skip to Content
How-To GuidesScalaUsing PostgreSQL from a Scala Agent

Using PostgreSQL from a Scala Agent

The Scala SDK already wraps golem:rdbms/postgres@1.5.0 in golem.host.Rdbms.

Imports

import golem.host.Rdbms import golem.host.Rdbms._

Open a Connection

Rdbms.Postgres.open("postgres://user:password@localhost:5432/app")

open, query, execute, commit, and rollback all return Either[DbError, T] instead of throwing.

Query Data

PostgreSQL placeholders use $1, $2, …

val message = for { conn <- Rdbms.Postgres.open("postgres://user:password@localhost:5432/app") result <- conn.query("SELECT $1::text", List(PostgresDbValue.Text("hello"))) row <- result.rows.headOption.toRight(DbError.Other("query returned no rows")) value <- row.values.headOption.toRight(DbError.Other("query returned no columns")) text <- value match { case PostgresDbValue.Text(value) => Right(value) case PostgresDbValue.VarChar(value) => Right(value) case PostgresDbValue.BpChar(value) => Right(value) case other => Left(DbError.Other(s"Unexpected PostgreSQL value: $other")) } } yield text

Execute Statements

conn.execute( "INSERT INTO notes (id, body) VALUES ($1, $2)", List(PostgresDbValue.Int4(1), PostgresDbValue.Text("hello")), )

Transactions

for { conn <- Rdbms.Postgres.open(url) tx <- conn.beginTransaction() _ <- tx.execute( "UPDATE notes SET body = $1 WHERE id = $2", List(PostgresDbValue.Text("updated"), PostgresDbValue.Int4(1)), ) _ <- tx.commit() } yield ()
Last updated on