Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

db

SQLite database operations. Forge embeds SQLite via the rusqlite crate. One connection is maintained per thread.

Functions

db.open(path) -> bool

Opens a SQLite database at path. Use ":memory:" for an in-memory database. Returns true on success.

db.open(":memory:")
db.open("app.db")

db.execute(sql, params?) -> null

Executes a SQL statement that does not return rows (CREATE, INSERT, UPDATE, DELETE). An optional second argument provides parameterized values as an array, using ? placeholders.

db.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)")

// Parameterized insert (recommended)
db.execute("INSERT INTO users VALUES (?, ?, ?)", [1, "Alice", "alice@example.com"])

// Batch execution (no params)
db.execute("INSERT INTO users VALUES (2, 'Bob', 'bob@example.com')")

db.query(sql, params?) -> array

Executes a SQL SELECT query and returns an array of objects. Each object maps column names to values. An optional second argument provides parameterized values.

let users = db.query("SELECT * FROM users")
// [{id: 1, name: "Alice", email: "alice@example.com"}, ...]

// Parameterized query
let result = db.query("SELECT * FROM users WHERE id = ?", [1])
say result[0].name  // "Alice"

db.close() -> null

Closes the current database connection.

db.close()

Full CRUD Example

// Open database
db.open(":memory:")

// Create table
db.execute("CREATE TABLE tasks (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title TEXT NOT NULL,
    done INTEGER DEFAULT 0
)")

// Create
db.execute("INSERT INTO tasks (title) VALUES (?)", ["Buy groceries"])
db.execute("INSERT INTO tasks (title) VALUES (?)", ["Write documentation"])
db.execute("INSERT INTO tasks (title) VALUES (?)", ["Deploy v2"])

// Read
let all_tasks = db.query("SELECT * FROM tasks")
say all_tasks

let pending = db.query("SELECT * FROM tasks WHERE done = ?", [0])
say len(pending)  // 3

// Update
db.execute("UPDATE tasks SET done = ? WHERE id = ?", [1, 1])

// Delete
db.execute("DELETE FROM tasks WHERE id = ?", [3])

// Verify
let remaining = db.query("SELECT * FROM tasks")
say remaining

// Close
db.close()

Notes

  • SQLite types map to Forge types: INTEGER -> int, REAL -> float, TEXT -> string, NULL -> null, BLOB -> string (as <blob N bytes>).
  • Parameterized queries (using ? placeholders with an array) are the recommended approach to prevent SQL injection.