Skip to Content
🚀 KalamDB v0.3.0-alpha2 is out — Learn more
SDK & ClientQuerying & DML

Querying & DML

Raw SQL execution

const res = await client.query('SELECT * FROM app.messages LIMIT 10');

With parameters:

const res = await client.query( 'SELECT * FROM app.messages WHERE conversation_id = $1', ['conv_42'], );

From client.ts, params are sent through queryWithParams(sql, JSON.stringify(params)).

Typed row parsing helpers

query() returns array rows + schema. For object-shaped typed rows:

interface MessageRow { id: string; sender: string; content: string; } const first = await client.queryOne<MessageRow>( 'SELECT id, sender, content FROM app.messages LIMIT 1' ); const all = await client.queryAll<MessageRow>( 'SELECT id, sender, content FROM app.messages' );

Internally, queryOne/queryAll use parseRows() from helpers/query_helpers.ts.

Execute as another user

await client.executeAsUser( 'SELECT * FROM app.messages LIMIT 1', 'alice', );

Source behavior:

  • wraps SQL as EXECUTE AS USER 'username' ( <statement> )
  • strips trailing semicolons in inner SQL
  • escapes ' in username

Convenience DML methods

await client.insert('app.messages', { id: 1, sender: 'alice', content: 'hello', }); await client.update('app.messages', 1, { content: 'updated' }); await client.delete('app.messages', 1);

Important caveat

update() builds SQL string values directly (with quote escaping for strings). For complex/untrusted inputs, prefer query() with parameter placeholders where possible.

Query response normalization utilities

query_helpers.ts exports:

  • normalizeQueryResponse(response, preferredOrder)
  • sortColumns(columns, preferredOrder)
  • parseRows<T>(response)
  • SYSTEM_TABLES_ORDER

Use these for stable column ordering in dashboards/admin UIs.

Last updated on