Dew

UPDATE

Update rows with the Updater builder.

The Updater builder constructs UPDATE queries. Create one via Table.Update(db) or dew.Update[T](db, schema).

Basic update

err := Users.Update(db).
    Set(Users.Name, "Bob").
    Where(Users.ID.Eq(1)).
    Exec()
// UPDATE users SET name = $1 WHERE users.id = $2

Multiple SET

err := Users.Update(db).
    Set(Users.Name, "Bob").
    Set(Users.Age, 30).
    Where(Users.ID.Eq(1)).
    Exec()
// UPDATE users SET name = $1, age = $2 WHERE users.id = $3

SET with expression

Use dew.Raw() for computed updates:

err := Users.Update(db).
    Set(Users.Age, dew.Raw("age + ?", 1)).
    Where(Users.ID.Eq(1)).
    Exec()
// UPDATE users SET age = age + $1 WHERE users.id = $2

Safety: WHERE required

Dew refuses to build an UPDATE without a WHERE clause to prevent accidental full-table updates:

// This returns an error:
_, _, err := Users.Update(db).Set(Users.Name, "Bob").ToSql()
// "dew: UNSAFE UPDATE! You must provide a Where clause."

// To update all rows intentionally:
err := Users.Update(db).
    Set(Users.Name, "Bob").
    Where(dew.Raw("1=1")).
    Exec()

Returning

sql, _, _ := Users.Update(db).
    Set(Users.Name, "Bob").
    Where(Users.ID.Eq(1)).
    Returning(Users.ID, Users.Name).
    ToSql()
// UPDATE users SET name = $1 WHERE users.id = $2 RETURNING id, name

Scan

var id int
var name string
err := Users.Update(db).
    Set(Users.Name, "Bob").
    Where(Users.ID.Eq(1)).
    Returning(Users.ID, Users.Name).
    Scan(ctx, &id, &name)

RowsAffected

n, err := Users.Update(db).
    Set(Users.Name, "Bob").
    Where(Users.Age.Lt(18)).
    RowsAffected()

Clone

base := Users.Update(db).Set(Users.Name, "Bob").Where(Users.ID.Eq(1))
clone := base.Clone()
clone.Set(Users.Age, 30)
// base is unchanged

ToSql

sql, args, err := Users.Update(db).
    Set(Users.Name, "Bob").
    Where(Users.ID.Eq(1)).
    ToSql()

On this page