Skip to main content

Write Data

Change Object

Rex client generates type safe change object for each model. The change object is used to create and update database records.

userChange := c.ChangeUser().SetName("test")

For nullable field, rex client generates extra set nullable methods

name := "test"
userChange := c.ChangeUser().SetNillableName(&name)

Create

To insert or update new data, rex requires a change object.

newPost1 := c.ChangePost().SetTitle("post title #1")
newPost2 := c.ChangePost().SetTitle("post title #2")
newUser := c.ChangeUser().
SetName("test").
SetEmail("test@example.com").
AddPosts(newPost1, newPost2)

user, err := c.QueryUser().Create(newUser)

Insert All

InsertAll methods generates batch insert sql with ON CONLICT DO NOTHING by default. Creating with association will not work with InsertAll, which requires Create in an iteration.

ids, err := c.InsertAllUser(
c.ChangeUser().SetName("user #1"),
c.ChangeUser().SetName("user #2"),
)

It converts into following sql,

INSERT INTO users(name) VALUES('user #1', 'user #2') ON CONFLICT DO NOTHING RETURNING id;

Update

Rex client supports update in ActiveRecord pattern with change object.

user, err := c.QueryUser().Find(1)
userChange := db.ChangeUser().SetName("new name")

err := user.Update(userChange)
err := user.UpdateContext(ctx, userChange)

Update an Attribute to nil

Rex generates setNillable methods to support set a field to null.

userChange := db.ChangeUser().SetNillableName(nil)

err := user.Update(userChange)

Update All

Update multiple records is done with UpdateAll method from query builder.

userQuery := c.QueryUser().Limit(10)
userChange := db.ChangeUser().SetName("new name")

rowsAffected, err := userQuery.UpdateAll(userChange)

Upsert

user, err := c.Upsert(c.ChangeUser().SetName("test"))
user, err := c.UpsertContext(ctx, c.ChangeUser().SetName("test"))

Delete

Rex client supports two types of delete.

user, err := c.QueryUser().Find(1)
err := user.Delete()

Delete by id from a query object.

err := c.QueryUser().Delete(1)

This also supports delete statement with context by c.QueryUserConext(ctx).

Delete All

Delete multiple records is also done with DeleteAll method from query builder, similar to UpdateAll

userQuery := c.QueryUser().Limit(10)

rowsAffected, err := userQuery.DeleteAll()