Dew

DELETE

Delete rows with the Deleter builder.

The Deleter builder constructs DELETE queries. Create one via Table.Delete(db) or dew.Delete[T](db, schema).

Basic delete

err := Users.Delete(db).
    Where(Users.ID.Eq(1)).
    Exec()
// DELETE FROM users WHERE users.id = $1

Multiple conditions

err := Users.Delete(db).
    Where(Users.Name.Eq("Alice"), Users.Age.Lt(18)).
    Exec()
// DELETE FROM users WHERE users.name = $1 AND users.age < $2

Safety: WHERE required

Like UPDATE, Dew refuses to build a DELETE without a WHERE clause:

// This returns an error:
_, _, err := Users.Delete(db).ToSql()
// "dew: UNSAFE DELETE! You must provide a Where clause."

// To delete all rows intentionally:
err := Users.Delete(db).
    Where(dew.Raw("1=1")).
    Exec()

Returning

sql, _, _ := Users.Delete(db).
    Where(Users.ID.Eq(1)).
    Returning(Users.ID, Users.Name).
    ToSql()
// DELETE FROM users WHERE users.id = $1 RETURNING id, name

Scan

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

ScanWith + Returning

deleted, err := Users.Delete(db).
    Where(Users.Age.Lt(18)).
    Returning(Users.ID, Users.Name).
    ScanWith(func(rows *sql.Rows) (*User, error) {
        var u User
        err := rows.Scan(&u.ID, &u.Name)
        return &u, err
    })
// deleted is []*User with all removed rows

If your struct implements RowScanner, prefer using All() on a selector or RowScanner over ScanWith. See RowScanner.

RowsAffected

n, err := Users.Delete(db).
    Where(Users.Age.Lt(18)).
    RowsAffected()

Clone

base := Users.Delete(db).Where(Users.Age.Lt(18))
clone := base.Clone()
clone.Where(Users.Name.Eq("Alice"))
// base is unchanged

ToSql

sql, args, err := Users.Delete(db).
    Where(Users.ID.Eq(1)).
    ToSql()

Context

err := Users.Delete(db).
    Where(Users.ID.Eq(1)).
    Exec(ctx)

n, err := Users.Delete(db).
    Where(Users.Age.Lt(18)).
    RowsAffected(ctx)

On this page