Rado GitHub

Update

Modify existing rows with db.update(Table).set(...).

import {eq} from 'rado'

await db.update(User).set({name: 'Ada Lovelace'}).where(eq(User.id, 1))

No where? Then you're updating every row in the table. Rado will happily do exactly what you asked.

Setting values

set takes a partial row, type-checked against the table. Values can be literals or SQL expressions, including ones referencing the current row:

import {sql} from 'rado'

await db
  .update(Post)
  .set({
    title: sql`upper(${Post.title})`,
    views: sql`${Post.views} + 1`
  })
  .where(eq(Post.id, 1))

Setting a nullable column to null works as expected:

await db.update(User).set({email: null}).where(eq(User.id, 1))

Columns declared with $onUpdate are refreshed automatically on every update.

Returning updated rows (PostgreSQL/SQLite)

const updated = await db
  .update(User)
  .set({name: 'Grace'})
  .where(eq(User.id, 2))
  .returning()

const justNames = await db
  .update(User)
  .set({name: 'Grace'})
  .where(eq(User.id, 2))
  .returning(User.name)

Ordering and limiting

Some dialects allow updates to be ordered and limited:

await db
  .update(Task)
  .set({assigned: true})
  .where(eq(Task.assigned, false))
  .orderBy(asc(Task.createdAt))
  .limit(1)