-
Notifications
You must be signed in to change notification settings - Fork 125
INSERT
INSERT statement is used to insert a single record or multiple records into a table. More about PostgreSQL INSERT statement can be found here: https://www.postgresql.org/docs/11/sql-insert.html
Following clauses are supported:
-
INSERT(columns...)
- list of columns for insert -
VALUES(values...)
- list of values -
MODEL(model)
- list of values for columns will be extracted from model object -
MODELS([]model)
- list of values for columns will be extracted from list of model objects -
QUERY(select)
- select statement that supplies the rows to be inserted. -
RETURNING(output_expression...)
- An expressions to be computed and returned by the INSERT statement after each row is inserted. 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.
insertStmt := Link.INSERT(Link.ID, Link.URL, Link.Name, Link.Description).
VALUES(100, "http://www.postgresqltutorial.com", "PostgreSQL Tutorial", DEFAULT).
VALUES(101, "http://www.google.com", "Google", DEFAULT).
VALUES(102, "http://www.yahoo.com", "Yahoo", nil)
Debug SQL of above insert statement:
INSERT INTO test_sample.link (id, url, name, description) VALUES
(100, 'http://www.postgresqltutorial.com', 'PostgreSQL Tutorial', DEFAULT),
(101, 'http://www.google.com', 'Google', DEFAULT),
(102, 'http://www.yahoo.com', 'Yahoo', NULL)
There is also shorthand notation for inserting model data:
tutorial := model.Link{
ID: 100,
URL: "http://www.postgresqltutorial.com",
Name: "PostgreSQL Tutorial",
}
google := model.Link{
ID: 101,
URL: "http://www.google.com",
Name: "Google",
}
yahoo := model.Link{
ID: 102,
URL: "http://www.yahoo.com",
Name: "Yahoo",
}
insertStmt := Link.INSERT(Link.ID, Link.URL, Link.Name, Link.Description).
MODEL(turorial).
MODEL(google).
MODEL(yahoo)
Or event shorter if model data is in the slice:
insertStmt := Link.INSERT(Link.ID, Link.URL, Link.Name, Link.Description).
MODELS([]model.Link{turorial, google, yahoo})
Link.ID, Link.URL, Link.Name, Link.Description
- is the same as Link.AllColumns
so above statement can be simplified to:
insertStmt := Link.INSERT(Link.AllColumns).
MODELS([]model.Link{turorial, google, yahoo})
Link.ID
is a primary key autoincrement column so it can be omitted in INSERT statement.
Link.MutableColumns
- is shorthand notation for list of all columns minus primary key columns.
insertStmt := Link.INSERT(Link.MutableColumns).
MODELS([]model.Link{turorial, google, yahoo})
Inserts using VALUES
, MODEL
and MODELS
can appear as the part of the same insert statement.
insertStmt := Link.INSERT(Link.ID, Link.URL, Link.Name, Link.Description, Link.Description).
VALUES(101, "http://www.google.com", "Google", DEFAULT, DEFAULT).
MODEL(turorial).
MODELS([]model.Link{yahoo})
// duplicate first 10 entries
insertStmt := Link.
INSERT(Link.URL, Link.Name).
QUERY(
SELECT(Link.URL, Link.Name).
FROM(Link).
WHERE(Link.ID.GT(Int(0)).AND(Link.ID.LT_EQ(10))),
)
To execute insert statement and get sql.Result:
res, err := insertStmt.Exec(db)
To execute insert statement and return row records inserted, insert statement has to have RETURNING clause:
insertStmt := Link.INSERT(Link.ID, Link.URL, Link.Name, Link.Description).
VALUES(100, "http://www.postgresqltutorial.com", "PostgreSQL Tutorial", DEFAULT).
VALUES(101, "http://www.google.com", "Google", DEFAULT).
RETURNING(Link.ID, Link.URL, Link.Name, Link.Description) // or RETURNING(Link.AllColumns)
dest := []model.Link{}
err := insertStmt.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