jet/wiki/UPDATE.md
go-jet 5e0e2f2908 Add RETURNING to Delete statement.
Add DELETE statement wiki page.
2019-06-30 17:16:00 +02:00

2.4 KiB

UPDATE changes the values of the specified columns in all rows that satisfy the condition. More about UPDATE statement in PostgreSQL: https://www.postgresql.org/docs/11/sql-update.html

Following clauses are supported:

  • UPDATE(columns...) - list of columns to update
  • SET(values...) - list of values for columns
  • MODEL(model) - list of values for columns will be extracted from model object
  • WHERE(condition) - only rows for which condition returns true will be updated.
  • RETURNING(output_expression...) - An expressions to be computed and returned by the UPDATE statement after each row is updated. The expressions can use any column names of the table. Write TableName.AllColumns to return all columns.

This list might be extended with feature Jet releases.

Example

// replace all Bing links with Yahoo
updateStmt := Link.
    UPDATE(Link.Name, Link.URL).
    SET("Yahoo", "http://yahoo.com").
    WHERE(Link.Name.EQ(String("Bing")))

Debug sql of above statement:

UPDATE test_sample.link          -- 'test_sample' is name of the schema
SET (name, url) = ('Yahoo', 'http://yahoo.com')
WHERE link.name = 'Bing';

Short-hand notation to extract model data for column values:

yahoo := model.Link{
    URL:  "http://www.yahoo.com",
    Name: "Yahoo",
}

updateStmt := Link.
    UPDATE(Link.Name, Link.URL, Link.Description).
    MODEL(yahoo).
    WHERE(Link.Name.EQ(String("Bing")))

Link.Name, Link.URL, Link.Description - can be replaced with Link.MutableColumns(all columns minus primary key column).
Primary key columns usually are not updated.

updateStmt := Link.
    UPDATE(Link.MutableColumns).
    MODEL(yahoo).
    WHERE(Link.Name.EQ(String("Bing")))

Execute statement

To execute update statement and get sql.Result:

res, err := updateStmt.Exec(db)

To execute update statement and return row records updated, statement has to have RETURNING clause:

updateStmt := Link.
    UPDATE(Link.MutableColumns).
    MODEL(yahoo).
    WHERE(Link.Name.EQ(String("Bing"))).
    RETURNING(Link.AllColumns)
    
dest := []model.Link{}

err := updateStmt.Query(db, &dest)
    

Use ExecContext and QueryContext to provide context object to execution.

SQL table used for the example:
CREATE TABLE IF NOT EXISTS link (
    id serial PRIMARY KEY,
    url VARCHAR (255) NOT NULL,
    name VARCHAR (255) NOT NULL,
    description VARCHAR (255)
);