std.db.pg
The std.db.pg
module provides functions for interacting with PostgreSQL databases, including executing queries, handling transactions, and mapping results to objects.
Core Functions
query(sql: string, ...bindings: any)
Executes a SQL query and returns the results as an array of objects.
Parameters:
sql
: The SQL query string
bindings
: Optional parameters to bind to the query
Return Type: Array<Object>
Example:
use std.db.pg;
let results = pg.query("SELECT * FROM users WHERE age > $1", 18);
// Returns an array of objects representing the query results
query_as(class: Class, sql: string, ...bindings: any)
Executes a SQL query and maps the results to instances of the specified class.
Parameters:
class
: The class to map results to
sql
: The SQL query string
bindings
: Optional parameters to bind to the query
Return Type: Array<Instance>
Example:
use std.db.pg;
class User {
id: number;
name: string;
age: number;
}
let users = pg.query_as(User, "SELECT * FROM users WHERE age > $1", 18);
// Returns an array of User instances
begin_transaction()
Starts a new database transaction. Returns a Transaction object that provides methods for executing queries within the transaction.
Return Type: Transaction
Example:
use std.db.pg;
let tx = pg.begin_transaction();
// Returns a Transaction object
Transaction Methods
The following methods are available on Transaction objects returned by begin_transaction()
.
query(sql: string, ...bindings: any)
Executes a SQL query within the transaction and returns the results as an array of objects.
Parameters:
sql
: The SQL query string
bindings
: Optional parameters to bind to the query
Return Type: Array<Object>
Example:
use std.db.pg;
let tx = pg.begin_transaction();
let results = tx.query("SELECT * FROM users WHERE age > $1", 18);
query_as(class: Class, sql: string, ...bindings: any)
Executes a SQL query within the transaction and maps the results to instances of the specified class.
Parameters:
class
: The class to map results to
sql
: The SQL query string
bindings
: Optional parameters to bind to the query
Return Type: Array<Instance>
Example:
use std.db.pg;
class User {
id: number;
name: string;
age: number;
}
let tx = pg.begin_transaction();
let users = tx.query_as(User, "SELECT * FROM users WHERE age > $1", 18);
commit()
Commits the transaction, saving all changes made within the transaction.
Return Type: nil
Example:
use std.db.pg;
let tx = pg.begin_transaction();
// Execute queries...
tx.commit();
rollback()
Rolls back the transaction, discarding all changes made within the transaction.
Return Type: nil
Example:
use std.db.pg;
let tx = pg.begin_transaction();
// Execute queries...
tx.rollback();
Usage Examples
Basic Query Example
use std.db.pg;
// Simple query
let users = pg.query("SELECT * FROM users WHERE age > $1", 18);
// Iterate through results
for user in users {
print(user.name);
}
Transaction Example
use std.db.pg;
// Start transaction
let tx = pg.begin_transaction();
// Update user balance
tx.query("UPDATE users SET balance = balance - $1 WHERE id = $2", 100, 123);
// Insert transaction record
tx.query("INSERT INTO transactions (user_id, amount) VALUES ($1, $2)", 123, -100);
// Commit if successful
tx.commit();
Typed Query Example
use std.db.pg;
// Define user class
class User {
id: number;
name: string;
email: string;
}
// Query users and map to class
let users = pg.query_as(User, "SELECT * FROM users WHERE active = true");
// Access typed properties
for user in users {
print(`${user.name} <${user.email}>`);
}
Parameter Binding Example
use std.db.pg;
// Query with different parameter types
let results = pg.query(
"SELECT * FROM users WHERE name = $1 AND age > $2 AND active = $3",
"John", // string
25, // number
true // boolean
);
Array Parameter Example
use std.db.pg;
// Query with array parameter
let user_ids = [1, 2, 3, 4];
let users = pg.query("SELECT * FROM users WHERE id = ANY($1)", user_ids);
Date Parameter Example
use std.db.pg;
// Query with date parameter
let users = pg.query(
"SELECT * FROM users WHERE created_at > $1",
"2023-01-01" // Date string in YYYY-MM-DD format
);