Skip to content

DSL API

The typed DSL (Domain-Specific Language) query builder provides compile-time safety for all database operations.

Table Definition

zig
const sqlite = @import("sqlite");

const User = sqlite.table("users", struct {
    id: i64,
    name: []const u8,
    email: []const u8,
});

Query Builder Methods

from()

Start a query on a table:

zig
var query = db.from(User);

insert()

Insert a row:

zig
var result = try db.from(User).insert(.{
    .id = 1,
    .name = "Alice",
    .email = "alice@example.com",
});
result.deinit();

fetchAll()

Execute and return all rows:

zig
var result = try db.from(User).fetchAll();
defer result.deinit();

where()

Filter rows:

zig
var result = try db.from(User)
    .where(User.column("name").eq("Alice"))
    .fetchAll();
defer result.deinit();

select() / selectFields() / selectAll()

Select specific columns:

zig
var result = try db.from(User).select(&.{ "id", "name" }).fetchAll();
defer result.deinit();

// Using selectFields
var result2 = try db.from(User).selectFields(&.{ "id", "name" }).fetchAll();
defer result2.deinit();

limit() / offset()

Pagination:

zig
var result = try db.from(User).limit(10).offset(20).fetchAll();
defer result.deinit();

distinct()

Remove duplicate rows:

zig
var result = try db.from(User)
    .innerJoin(Order, "id", "user_id")
    .select("*")
    .distinct()
    .fetchAll();
defer result.deinit();

Joins

zig
// Inner join
var result = try db.from(User)
    .innerJoin(Order, "id", "user_id")
    .fetchAll();

// Left join
var result = try db.from(User)
    .leftJoin(Order, "id", "user_id")
    .fetchAll();

// Right join
var result = try db.from(User)
    .rightJoin(Order, "id", "user_id")
    .fetchAll();

// Full join
var result = try db.from(User)
    .fullJoin(Order, "id", "user_id")
    .fetchAll();

Aggregates

zig
var total = try db.from(Order).sum("amount").fetchAll();
var avg = try db.from(Order).average("amount").fetchAll();
var min = try db.from(Order).minimum("amount").fetchAll();
var max = try db.from(Order).maximum("amount").fetchAll();
var count = try db.from(Order).count("id").fetchAll();

Update

zig
var result = try db.from(User)
    .where(User.column("id").eq(1))
    .update(.{ .name = "Bob" });
result.deinit();

Delete

zig
var result = try db.from(User)
    .where(User.column("id").eq(1))
    .delete();
result.deinit();

Expressions

zig
User.column("age").eq(25)
User.column("name").ne("Bob")
User.column("amount").gt(100)
User.column("amount").gte(100)
User.column("amount").lt(50)
User.column("amount").lte(50)
User.column("name").like("%alice%")
User.column("name").isNull()
User.column("name").isNotNull()
User.column("id").between(1, 10)
User.column("id").in(&.{ 1, 2, 3 })

Released under the MIT License.