Skip to content

Database Guide

DatabaseClient wraps PostgREST.

Core operations

  • select
  • insert
  • update
  • delete
  • rpc

Typed helpers

Use extension helpers for serialization-safe usage:

  • selectTyped<T>
  • insertTyped<T>
  • updateTyped<T>
  • rpcTyped<T>

Read with filter DSL

@Serializable
data class Todo(
    val id: String,
    val title: String,
    val done: Boolean,
)

@Serializable
data class TodoPatch(val done: Boolean)

@Serializable
data class DashboardStatsRequest(val user_id: String)

@Serializable
data class DashboardStats(val total: Int)

val todos = database.selectTyped<Todo>(table = "todos") {
    eq("done", "false")
    order("created_at", ascending = false)
    limit(20)
}

Insert and update

database.insertTyped(
    table = "todos",
    value = Todo(id = "1", title = "Ship docs", done = false),
)

database.updateTyped(
    table = "todos",
    value = TodoPatch(done = true),
) {
    eq("id", "1")
}

RPC example

val stats: SupabaseResult<DashboardStats> = database.rpcTyped<DashboardStatsRequest, DashboardStats>(
    function = "get_dashboard_stats",
    request = DashboardStatsRequest(user_id = "123"),
)