Query Data

SELECT files live under queries/. Subdirectories become generated namespaces and file names become generated method names.

queries/task/selectAll.sql
queries/task/selectById.sql

Basic SELECT

SELECT id, title, completed, created_at
FROM task
ORDER BY created_at DESC;

queries/task/selectAll.sql generates a KMP method under db.task:

val rows = db.task.selectAll().asList()

rows.forEach { row ->
    println(row.title)
}

Parameters

Named parameters become generated params objects.

SELECT id, title, completed, created_at
FROM task
WHERE id = :id;
val task = db.task
    .selectById(TaskQuery.SelectById.Params(id = 42))
    .asOneOrNull()

Result Cardinality

Use the runner method that matches the expected result shape:

  • asList() for zero or more rows.
  • asOne() when exactly one row must exist.
  • asOneOrNull() when zero or one row is valid.

KMP SELECT methods expose flow APIs for reactive reads:

database.task
    .selectAll()
    .asFlow()
    .collect { rows -> tasks = rows }