-
Notifications
You must be signed in to change notification settings - Fork 125
UPDATE
UPDATE changes the values of the specified columns in all rows that satisfy the condition.
More about UPDATE statement can be found at:
PostgreSQL - https://www.postgresql.org/docs/11/sql-update.html
MySQL - https://dev.mysql.com/doc/refman/8.0/en/update.html
MariaDB - https://mariadb.com/kb/en/library/update/
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. -
FROM(tables...)
- table expression allowing columns from other tables to appear in the WHERE condition and update expressions. (postgres, sqlite) -
RETURNING(output_expression...)
- expressions to be computed and returned by the UPDATE statement after each row is updated. Expressions can use any column names of the table. (postgres, sqlite)
// replace all Bing links with Yahoo
updateStmt := Link.UPDATE(Link.Name, Link.URL).
SET("Yahoo", "http://yahoo.com").
WHERE(Link.Name.EQ(String("Bing")))
// OR using type-safe SET
updateStmt := Link.UPDATE().
SET(
Link.Name.SET(String("Yahoo")),
Link.URL.SET(String("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';
This notation is recommended, because model types will add type and pointer safety to update query.
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")))
ColumnList
can be used to pass a custom list of columns to the UPDATE query:
columnList := ColumnList{Link.Name, Link.Description}
updateStmt := Link.
UPDATE(columnList).
MODEL(yahoo).
WHERE(Link.Name.EQ(String("Bing")))
To execute update statement and get sql.Result:
res, err := updateStmt.Exec(db)
To execute PostgreSQL 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.
CREATE TABLE IF NOT EXISTS link (
id serial PRIMARY KEY,
url VARCHAR (255) NOT NULL,
name VARCHAR (255) NOT NULL,
description VARCHAR (255)
);
- Home
- Generator
- Model
- SQL Builder
- Query Result Mapping (QRM)
-
FAQ
- How to execute jet statement in SQL transaction?
- How to construct dynamic projection list?
- How to construct dynamic condition?
- How to use jet in multi-tenant environment?
- How to change model field type?
- How to use custom(or currently unsupported) functions and operators?
- How to use IN/NOT_IN with dynamic list of values?
- Scan stopped working after naming a destination type