.Upsert[T](table, data)
Creates or updates a specific record.
Method Syntax
db.Upsert[T](table, data)
This function creates a new document / record or replaces the current one with the specified data.
Arguments
| Arguments | Description |
|---|
table required | The table to upsert the record to. |
data required | The document / record data to upsert. |
Example usage
package main
import (
"fmt"
"time"
surrealdb "github.com/surrealdb/surrealdb.go"
"github.com/surrealdb/surrealdb.go/pkg/models"
)
func ExampleUpsert() {
db, err := surrealdb.New("ws://localhost:8000")
if err != nil {
panic(err)
}
if err = db.Use("test", "test"); err != nil {
panic(err)
}
token, err := db.SignIn(&surrealdb.Auth{
Username: "root",
Password: "root",
})
if err != nil {
panic(err)
}
if err = db.Authenticate(token); err != nil {
panic(err)
}
type Person struct {
ID *models.RecordID `json:"id,omitempty"`
Name string `json:"name"`
CreatedAt models.CustomDateTime `json:"created_at,omitempty"`
UpdatedAt *models.CustomDateTime `json:"updated_at,omitempty"`
}
createdAt, err := time.Parse(time.RFC3339, "2023-10-01T12:00:00Z")
if err != nil {
panic(err)
}
inserted, err := surrealdb.Upsert[Person](
db,
models.NewRecordID("persons", "yusuke"),
map[string]any{
"name": "Yusuke",
"created_at": createdAt,
})
if err != nil {
panic(err)
}
fmt.Printf("Insert via upsert result: %+s\n", *inserted)
updated, err := surrealdb.Upsert[Person](
db,
models.NewRecordID("persons", "yusuke"),
map[string]any{
"name": "Yusuke Updated",
"updated_at": createdAt,
},
)
if err != nil {
panic(err)
}
fmt.Printf("Update via upsert result: %+s\n", *updated)
udpatedAt, err := time.Parse(time.RFC3339, "2023-10-02T12:00:00Z")
if err != nil {
panic(err)
}
updatedFurther, err := surrealdb.Upsert[Person](
db,
models.NewRecordID("persons", "yusuke"),
map[string]any{
"name": "Yusuke Updated Further",
"created_at": createdAt,
"updated_at": models.CustomDateTime{
Time: udpatedAt,
},
},
)
if err != nil {
panic(err)
}
fmt.Printf("Update further via upsert result: %+s\n", *updatedFurther)
_, err = surrealdb.Upsert[struct{}](
db,
models.NewRecordID("persons", "yusuke"),
map[string]any{
"name": "Yusuke Updated Last",
},
)
if err != nil {
panic(err)
}
selected, err := surrealdb.Select[Person](
db,
models.NewRecordID("persons", "yusuke"),
)
if err != nil {
panic(err)
}
fmt.Printf("Selected person: %+s\n", *selected)
}
Bulk upsert example
package main
import (
"fmt"
"strings"
surrealdb "github.com/surrealdb/surrealdb.go"
"github.com/surrealdb/surrealdb.go/pkg/models"
)
func ExampleQuery_bluk_insert_upsert() {
db, err := surrealdb.New("ws://localhost:8000")
if err != nil {
panic(err)
}
if err = db.Use("test", "test"); err != nil {
panic(err)
}
token, err := db.SignIn(&surrealdb.Auth{
Username: "root",
Password: "root",
})
if err != nil {
panic(err)
}
if err = db.Authenticate(token); err != nil {
panic(err)
}
type Person struct {
ID *models.RecordID `json:"id"`
Note string `json:"note"`
Num int `json:"num"`
Loc models.GeometryPoint `json:"loc"`
}
nthPerson := func(i int) Person {
return Person{
ID: &models.RecordID{Table: "persons", ID: fmt.Sprintf("p%d", i)},
Note: fmt.Sprintf("inserted%d", i),
Num: i,
Loc: models.GeometryPoint{
Longitude: 12.34 + float64(i),
Latitude: 45.65 + float64(i),
},
}
}
var persons []Person
for i := 0; i < 2; i++ {
persons = append(persons, nthPerson(i))
}
insert, err := surrealdb.Query[any](
db,
`INSERT INTO persons $persons RETURN NONE`,
map[string]any{
"persons": persons,
})
if err != nil {
panic(err)
}
fmt.Println("# INSERT INTO")
fmt.Printf("Count : %d\n", len(*insert))
fmt.Printf("Status : %+s\n", (*insert)[0].Status)
fmt.Printf("Result : %+v\n", (*insert)[0].Result)
select1, err := surrealdb.Query[[]Person](
db,
`SELECT * FROM persons ORDER BY id.id`,
nil)
if err != nil {
panic(err)
}
fmt.Printf("Selected: %+v\n", (*select1)[0].Result)
persons = append(persons, nthPerson(2))
insertIgnore, err := surrealdb.Query[any](
db,
`INSERT IGNORE INTO persons $persons RETURN NONE`,
map[string]any{
"persons": persons,
})
if err != nil {
panic(err)
}
fmt.Println("# INSERT IGNORE INTO")
fmt.Printf("Count : %d\n", len(*insertIgnore))
fmt.Printf("Status : %+s\n", (*insertIgnore)[0].Status)
fmt.Printf("Result : %+v\n", (*insertIgnore)[0].Result)
select2, err := surrealdb.Query[[]Person](
db,
`SELECT * FROM persons ORDER BY id.id`,
nil)
if err != nil {
panic(err)
}
fmt.Printf("Selected: %+v\n", (*select2)[0].Result)
for i := 0; i < 3; i++ {
persons[i].Note = fmt.Sprintf("updated%d", i)
}
persons = append(persons, nthPerson(3))
var upsertQueries []string
vars := make(map[string]any)
for i, p := range persons {
upsertQueries = append(upsertQueries,
fmt.Sprintf(`UPSERT persons CONTENT $content%d RETURN NONE`, i),
)
vars[fmt.Sprintf("content%d", i)] = p
}
upsert, err := surrealdb.Query[any](
db,
strings.Join(upsertQueries, ";"),
vars,
)
if err != nil {
panic(err)
}
fmt.Println("# UPSERT CONTENT")
fmt.Printf("Count : %d\n", len(*upsert))
fmt.Printf("Status : %+s\n", (*upsert)[0].Status)
fmt.Printf("Result : %+v\n", (*upsert)[0].Result)
select3, err := surrealdb.Query[[]Person](
db,
`SELECT * FROM persons ORDER BY id.id`,
nil)
if err != nil {
panic(err)
}
fmt.Printf("Selected: %+v\n", (*select3)[0].Result)
}