Skip to content

ApiFull

ApiFull<TResult, TTableDef, TWithout> = object

Defined in: packages/@livestore/common/dist/schema/state/sqlite/query-builder/api.d.ts:167

TResult

TTableDef extends TableDefBase

TWithout extends ApiFeature

readonly count: () => QueryBuilder<number, TTableDef, TWithout | "row" | "count" | "select" | "orderBy" | "first" | "offset" | "limit" | "returning" | "onConflict">

Defined in: packages/@livestore/common/dist/schema/state/sqlite/query-builder/api.d.ts:213

Example:

db.todos.count()
db.todos.count().where('completed', true)

QueryBuilder<number, TTableDef, TWithout | "row" | "count" | "select" | "orderBy" | "first" | "offset" | "limit" | "returning" | "onConflict">


readonly delete: () => QueryBuilder<TResult, TTableDef, TWithout | "row" | "select" | "count" | "orderBy" | "first" | "offset" | "limit" | "onConflict">

Defined in: packages/@livestore/common/dist/schema/state/sqlite/query-builder/api.d.ts:323

Delete rows from the table that match the where clause

Example:

db.todos.delete().where({ status: 'completed' })

Note that it’s generally recommended to do soft-deletes for synced apps.

QueryBuilder<TResult, TTableDef, TWithout | "row" | "select" | "count" | "orderBy" | "first" | "offset" | "limit" | "onConflict">


readonly first: <TBehaviour, TFallback>(behaviour?) => QueryBuilder<TBehaviour extends object ? ReturnType<TBehaviour["fallback"]> | GetSingle<TResult> : TBehaviour extends object ? undefined | GetSingle<TResult> : GetSingle<TResult>, TTableDef, TWithout | "row" | "first" | "orderBy" | "select" | "limit" | "offset" | "where" | "returning" | "onConflict">

Defined in: packages/@livestore/common/dist/schema/state/sqlite/query-builder/api.d.ts:253

Example:

db.todos.first()
db.todos.where('id', '123').first() // will return `undefined` if no rows are returned
db.todos.where('id', '123').first({ behaviour: 'error' }) // will throw if no rows are returned
db.todos.first({ behaviour: 'fallback', fallback: () => ({ id: '123', text: 'Buy milk', status: 'active' }) })

Behaviour:

  • undefined: Will return undefined if no rows are returned (default behaviour)
  • error: Will throw if no rows are returned
  • fallback: Will return a fallback value if no rows are returned

TBehaviour extends FirstQueryBehaviour<GetSingle<TResult>, TFallback>

TFallback = never

FirstQueryBehaviour<GetSingle<TResult>, TFallback> & TBehaviour

QueryBuilder<TBehaviour extends object ? ReturnType<TBehaviour["fallback"]> | GetSingle<TResult> : TBehaviour extends object ? undefined | GetSingle<TResult> : GetSingle<TResult>, TTableDef, TWithout | "row" | "first" | "orderBy" | "select" | "limit" | "offset" | "where" | "returning" | "onConflict">


readonly insert: (values) => QueryBuilder<TResult, TTableDef, TWithout | "row" | "select" | "count" | "orderBy" | "first" | "offset" | "limit" | "where">

Defined in: packages/@livestore/common/dist/schema/state/sqlite/query-builder/api.d.ts:266

Insert a new row into the table

Example:

db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' })

TTableDef["insertSchema"]["Type"]

QueryBuilder<TResult, TTableDef, TWithout | "row" | "select" | "count" | "orderBy" | "first" | "offset" | "limit" | "where">


readonly limit: (limit) => QueryBuilder<TResult, TTableDef, TWithout | "row" | "limit" | "offset" | "first" | "orderBy" | "returning" | "onConflict">

Defined in: packages/@livestore/common/dist/schema/state/sqlite/query-builder/api.d.ts:238

Example:

db.todos.limit(10)

number

QueryBuilder<TResult, TTableDef, TWithout | "row" | "limit" | "offset" | "first" | "orderBy" | "returning" | "onConflict">


readonly offset: (offset) => QueryBuilder<TResult, TTableDef, TWithout | "row" | "offset" | "orderBy" | "returning" | "onConflict">

Defined in: packages/@livestore/common/dist/schema/state/sqlite/query-builder/api.d.ts:231

Example:

db.todos.offset(10)

number

QueryBuilder<TResult, TTableDef, TWithout | "row" | "offset" | "orderBy" | "returning" | "onConflict">


readonly onConflict: {<TTarget>(target, action): QueryBuilder<TResult, TTableDef, TWithout | "select" | "where" | "count" | "orderBy" | "offset" | "limit" | "first" | "row">; <TTarget>(target, action, updateValues): QueryBuilder<TResult, TTableDef, TWithout | "select" | "where" | "count" | "orderBy" | "offset" | "limit" | "first" | "row">; }

Defined in: packages/@livestore/common/dist/schema/state/sqlite/query-builder/api.d.ts:289

Upsert: insert a row, or handle conflicts on existing rows. Equivalent to SQLite’s INSERT ... ON CONFLICT clause.

Actions:

  • 'ignore': Skip the insert if a row with the same key exists
  • 'replace': Delete the existing row and insert the new one
  • 'update': Update specific columns on the existing row
// Ignore: skip if row exists
db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).onConflict('id', 'ignore')
// Replace: delete existing row and insert new one
db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).onConflict('id', 'replace')
// Update: merge specific columns into existing row
db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).onConflict('id', 'update', { text: 'Buy soy milk' })

NOTE: Composite primary keys are not yet supported.

<TTarget>(target, action): QueryBuilder<TResult, TTableDef, TWithout | "select" | "where" | "count" | "orderBy" | "offset" | "limit" | "first" | "row">

TTarget extends string | number | symbol | readonly keyof TTableDef["sqliteDef"]["columns"][]

TTarget

"replace" | "ignore"

QueryBuilder<TResult, TTableDef, TWithout | "select" | "where" | "count" | "orderBy" | "offset" | "limit" | "first" | "row">

<TTarget>(target, action, updateValues): QueryBuilder<TResult, TTableDef, TWithout | "select" | "where" | "count" | "orderBy" | "offset" | "limit" | "first" | "row">

TTarget extends string | number | symbol | readonly keyof TTableDef["sqliteDef"]["columns"][]

TTarget

"update"

Partial<TTableDef["rowSchema"]["Type"]>

QueryBuilder<TResult, TTableDef, TWithout | "select" | "where" | "count" | "orderBy" | "offset" | "limit" | "first" | "row">


readonly orderBy: {<TColName>(col, direction): QueryBuilder<TResult, TTableDef, TWithout | "onConflict" | "returning">; <TParams>(params): QueryBuilder<TResult, TTableDef, TWithout | "onConflict" | "returning">; }

Defined in: packages/@livestore/common/dist/schema/state/sqlite/query-builder/api.d.ts:221

Example:

db.todos.orderBy('createdAt', 'desc')
db.todos.orderBy([{ col: 'createdAt', direction: 'desc' }])

<TColName>(col, direction): QueryBuilder<TResult, TTableDef, TWithout | "onConflict" | "returning">

TColName extends string

TColName

"asc" | "desc"

QueryBuilder<TResult, TTableDef, TWithout | "onConflict" | "returning">

<TParams>(params): QueryBuilder<TResult, TTableDef, TWithout | "onConflict" | "returning">

TParams extends OrderByParams<TTableDef>

TParams

QueryBuilder<TResult, TTableDef, TWithout | "onConflict" | "returning">


readonly returning: <TColumns>(…columns) => QueryBuilder<ReadonlyArray<{ readonly [K in TColumns]: TTableDef["sqliteDef"]["columns"][K]["schema"]["Type"] }>, TTableDef>

Defined in: packages/@livestore/common/dist/schema/state/sqlite/query-builder/api.d.ts:301

Similar to the .select API but for write queries (insert, update, delete).

Example:

db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).returning('id')

TColumns extends keyof TTableDef["sqliteDef"]["columns"] & string

TColumns[]

QueryBuilder<ReadonlyArray<{ readonly [K in TColumns]: TTableDef["sqliteDef"]["columns"][K]["schema"]["Type"] }>, TTableDef>


readonly select: {<TColumn>(pluckColumn): QueryBuilder<readonly TTableDef["sqliteDef"]["columns"][TColumn]["schema"]["Type"][], TTableDef, TWithout | "select" | "onConflict" | "returning" | "row">; <TColumns>(…columns): QueryBuilder<readonly { readonly [K in string]: TTableDef["sqliteDef"]["columns"][K]["schema"]["Type"] }[], TTableDef, TWithout | "select" | "count" | "onConflict" | "returning" | "row">; }

Defined in: packages/@livestore/common/dist/schema/state/sqlite/query-builder/api.d.ts:177

SELECT * is the default

Example:

db.todos.select('id', 'text', 'completed')
db.todos.select('id')

<TColumn>(pluckColumn): QueryBuilder<readonly TTableDef["sqliteDef"]["columns"][TColumn]["schema"]["Type"][], TTableDef, TWithout | "select" | "onConflict" | "returning" | "row">

Selects and plucks a single column

TColumn extends string

TColumn

QueryBuilder<readonly TTableDef["sqliteDef"]["columns"][TColumn]["schema"]["Type"][], TTableDef, TWithout | "select" | "onConflict" | "returning" | "row">

<TColumns>(…columns): QueryBuilder<readonly { readonly [K in string]: TTableDef["sqliteDef"]["columns"][K]["schema"]["Type"] }[], TTableDef, TWithout | "select" | "count" | "onConflict" | "returning" | "row">

Select multiple columns

TColumns extends string

TColumns[]

QueryBuilder<readonly { readonly [K in string]: TTableDef["sqliteDef"]["columns"][K]["schema"]["Type"] }[], TTableDef, TWithout | "select" | "count" | "onConflict" | "returning" | "row">


readonly update: (values) => QueryBuilder<TResult, TTableDef, TWithout | "row" | "select" | "count" | "orderBy" | "first" | "offset" | "limit" | "onConflict">

Defined in: packages/@livestore/common/dist/schema/state/sqlite/query-builder/api.d.ts:312

Update rows in the table that match the where clause

Example:

db.todos.update({ status: 'completed' }).where({ id: '123' })

Partial<TTableDef["rowSchema"]["Type"]>

QueryBuilder<TResult, TTableDef, TWithout | "row" | "select" | "count" | "orderBy" | "first" | "offset" | "limit" | "onConflict">


readonly where: {(params): QueryBuilder<TResult, TTableDef, TWithout | "select" | "row">; <TColName>(col, value): QueryBuilder<TResult, TTableDef, TWithout | "select" | "row">; <TColName>(col, op, value): QueryBuilder<TResult, TTableDef, TWithout | "select" | "row">; <TColName>(col, op, value): QueryBuilder<TResult, TTableDef, TWithout | "select" | "row">; }

Defined in: packages/@livestore/common/dist/schema/state/sqlite/query-builder/api.d.ts:200

Notes:

  • All where clauses are ANDed together by default.
  • null values only support = and != which is translated to IS NULL and IS NOT NULL.

Example:

db.todos.where('completed', true)
db.todos.where('completed', '!=', true)
db.todos.where({ completed: true })
db.todos.where({ completed: { op: '!=', value: true } })

TODO: Also support OR

(params): QueryBuilder<TResult, TTableDef, TWithout | "select" | "row">

WhereParams<TTableDef>

QueryBuilder<TResult, TTableDef, TWithout | "select" | "row">

<TColName>(col, value): QueryBuilder<TResult, TTableDef, TWithout | "select" | "row">

TColName extends string | number | symbol

TColName

TTableDef["sqliteDef"]["columns"][TColName]["schema"]["Type"]

QueryBuilder<TResult, TTableDef, TWithout | "select" | "row">

<TColName>(col, op, value): QueryBuilder<TResult, TTableDef, TWithout | "select" | "row">

TColName extends string | number | symbol

TColName

In

readonly TTableDef["sqliteDef"]["columns"][TColName]["schema"]["Type"][]

QueryBuilder<TResult, TTableDef, TWithout | "select" | "row">

<TColName>(col, op, value): QueryBuilder<TResult, TTableDef, TWithout | "select" | "row">

TColName extends string | number | symbol

TColName

SingleValue

TTableDef["sqliteDef"]["columns"][TColName]["schema"]["Type"]

QueryBuilder<TResult, TTableDef, TWithout | "select" | "row">