Skip to Content
DevelopUsing Relational Databases

Using Relational Databases

Golem provides an API to integrate with popular relational database systems from any of the supported languages. The currently supported databases are:

  • PostgreSQL
  • MySQL
  • Apache Ignite 2

See the full API definition

declare module 'golem:rdbms/types@1.5.0' { export type Uuid = { highBits: bigint; lowBits: bigint; }; export type Date = { year: number; month: number; day: number; }; export type Time = { hour: number; minute: number; second: number; nanosecond: number; }; export type Timestamp = { date: Date; time: Time; }; export type Timestamptz = { timestamp: Timestamp; offset: number; }; export type Timetz = { time: Time; offset: number; }; } declare module 'golem:rdbms/postgres@1.5.0' { import * as golemRdbms150Types from 'golem:rdbms/types@1.5.0'; export class LazyDbValue { constructor(value: DbValue); get(): DbValue; } export class LazyDbColumnType { constructor(value: DbColumnType); get(): DbColumnType; } export class DbResultStream { getColumns(): DbColumn[]; getNext(): DbRow[] | undefined; } export class DbConnection { /** @throws Error */ static open(address: string): DbConnection; /** @throws Error */ query(statement: string, params: DbValue[]): DbResult; /** @throws Error */ queryStream(statement: string, params: DbValue[]): DbResultStream; /** @throws Error */ execute(statement: string, params: DbValue[]): bigint; /** @throws Error */ beginTransaction(): DbTransaction; } export class DbTransaction { /** @throws Error */ query(statement: string, params: DbValue[]): DbResult; /** @throws Error */ queryStream(statement: string, params: DbValue[]): DbResultStream; /** @throws Error */ execute(statement: string, params: DbValue[]): bigint; /** @throws Error */ commit(): void; /** @throws Error */ rollback(): void; } export type Timestamp = golemRdbms150Types.Timestamp; export type Timestamptz = golemRdbms150Types.Timestamptz; export type Date = golemRdbms150Types.Date; export type Time = golemRdbms150Types.Time; export type Timetz = golemRdbms150Types.Timetz; export type Uuid = golemRdbms150Types.Uuid; export type Error = | { tag: 'connection-failure'; val: string } | { tag: 'query-parameter-failure'; val: string } | { tag: 'query-execution-failure'; val: string } | { tag: 'query-response-failure'; val: string } | { tag: 'other'; val: string }; export type SparseVec = { dim: number; indices: number[]; values: number[]; }; export type DbValue = | { tag: 'text'; val: string } | { tag: 'varchar'; val: string } | { tag: 'timestamp'; val: Timestamp } | { tag: 'timestamptz'; val: Timestamptz } | { tag: 'json'; val: string } | { tag: 'jsonb'; val: string } | { tag: 'uuid'; val: Uuid } | { tag: 'array'; val: LazyDbValue[] } | { tag: 'vector'; val: number[] } | { tag: 'halfvec'; val: number[] } | { tag: 'sparsevec'; val: SparseVec } | { tag: 'null' }; export type DbColumnType = | { tag: 'text' } | { tag: 'varchar' } | { tag: 'timestamp' } | { tag: 'timestamptz' } | { tag: 'json' } | { tag: 'jsonb' } | { tag: 'uuid' } | { tag: 'array'; val: LazyDbColumnType } | { tag: 'vector' } | { tag: 'halfvec' } | { tag: 'sparsevec' }; export type DbColumn = { ordinal: bigint; name: string; dbType: DbColumnType; dbTypeName: string; }; export type DbRow = { values: DbValue[]; }; export type DbResult = { columns: DbColumn[]; rows: DbRow[]; }; } declare module 'golem:rdbms/mysql@1.5.0' { import * as golemRdbms150Types from 'golem:rdbms/types@1.5.0'; export class DbResultStream { getColumns(): DbColumn[]; getNext(): DbRow[] | undefined; } export class DbConnection { /** @throws Error */ static open(address: string): DbConnection; /** @throws Error */ query(statement: string, params: DbValue[]): DbResult; /** @throws Error */ queryStream(statement: string, params: DbValue[]): DbResultStream; /** @throws Error */ execute(statement: string, params: DbValue[]): bigint; /** @throws Error */ beginTransaction(): DbTransaction; } export class DbTransaction { /** @throws Error */ query(statement: string, params: DbValue[]): DbResult; /** @throws Error */ queryStream(statement: string, params: DbValue[]): DbResultStream; /** @throws Error */ execute(statement: string, params: DbValue[]): bigint; /** @throws Error */ commit(): void; /** @throws Error */ rollback(): void; } export type Date = golemRdbms150Types.Date; export type Time = golemRdbms150Types.Time; export type Timestamp = golemRdbms150Types.Timestamp; export type Error = | { tag: 'connection-failure'; val: string } | { tag: 'query-parameter-failure'; val: string } | { tag: 'query-execution-failure'; val: string } | { tag: 'query-response-failure'; val: string } | { tag: 'other'; val: string }; export type DbColumnType = | { tag: 'varchar' } | { tag: 'text' } | { tag: 'timestamp' } | { tag: 'json' }; export type DbColumn = { ordinal: bigint; name: string; dbType: DbColumnType; dbTypeName: string; }; export type DbValue = | { tag: 'varchar'; val: string } | { tag: 'text'; val: string } | { tag: 'timestamp'; val: Timestamp } | { tag: 'json'; val: string } | { tag: 'null' }; export type DbRow = { values: DbValue[]; }; export type DbResult = { columns: DbColumn[]; rows: DbRow[]; }; }

Executing SQL statements

To execute an SQL statement with golem-rdbms, first crete a db-connection resource and call execute on it:

MySQL

import { DbConnection } from "golem:rdbms/mysql@1.5.0"; // Connecting to the database called 'test' with user 'root' const conn = DbConnection.open("mysql://root@localhost:3306/test"); conn.execute( `CREATE TABLE IF NOT EXISTS test_users ( user_id varchar(25) NOT NULL, name varchar(255) NOT NULL, created_on timestamp NOT NULL DEFAULT NOW(), PRIMARY KEY (user_id) );`, [] )

The functions in the golem:rdbms/mysql@1.5.0 module are not async. This is due to a limitation of the current Golem runtime, and are subject to change in future releases.

PostgreSQL

import { DbConnection } from "golem:rdbms/postgres@1.5.0"; // Connecting to the database called 'test' with user 'user' const conn = DbConnection.open("postgresql://user@localhost:5432/test"); conn.execute( `CREATE TABLE IF NOT EXISTS test_users ( user_id varchar(25) NOT NULL, name varchar(255) NOT NULL, created_on timestamp NOT NULL DEFAULT NOW(), PRIMARY KEY (user_id) );`, [] )

The functions in the golem:rdbms/postgres@1.5.0 module are not async. This is due to a limitation of the current Golem runtime, and are subject to change in future releases.

Apache Ignite

import { DbConnection } from "golem:rdbms/ignite2@1.5.0"; // Connecting to an Apache Ignite 2 instance const conn = DbConnection.open("ignite://localhost:10800"); conn.execute( `CREATE TABLE IF NOT EXISTS test_users ( user_id varchar(25) NOT NULL, name varchar(255) NOT NULL, PRIMARY KEY (user_id) ) WITH "CACHE_NAME=TestUsers";`, [] ) // Querying data const result = conn.query("SELECT user_id, name FROM test_users WHERE name = ?", [ { tag: "db-string", val: "hello" } ]); // Using transactions const tx = conn.beginTransaction(); tx.execute("INSERT INTO test_users (user_id, name) VALUES (?, ?)", [ { tag: "db-string", val: "1" }, { tag: "db-string", val: "Alice" } ]); tx.commit();

The functions in the golem:rdbms/ignite2@1.5.0 module are not async. This is due to a limitation of the current Golem runtime, and are subject to change in future releases.

API

Additionally you can:

  • query executes a SQL statement and returns a result
  • query-stream executs a SQL statement and returns a streaming result
  • begin-transaction creates a transaction resource on which, in addition to the query and execute functions, there is also a commit and a rollback method.
Last updated on