go-zero
go-zero copied to clipboard
Can I use transactions with the CRUD code generated by goctl?
go-zero自动生成的crud如下:
subscriptionsModel interface {
Insert(ctx context.Context, data *Subscriptions) (sql.Result, error)
FindOne(ctx context.Context, id int64) (*Subscriptions, error)
Update(ctx context.Context, data *Subscriptions) error
Delete(ctx context.Context, id int64) error
}
usersModel interface {
Insert(ctx context.Context, data *Users) (sql.Result, error)
FindOne(ctx context.Context, id int64) (*Users, error)
Update(ctx context.Context, data *Users) error
Delete(ctx context.Context, id int64) error
}
如果我想使用事务,应该怎么样直接调用生成的crud? 难道我只能重新写一个insert和update方法来操作吗,像这样。有没有更方便的方法?
err = c.Conn.TransactCtx(context.Background(), func(ctx context.Context, session sqlx.Session) error {
query, _, err := goqu.Dialect("mysql").Insert(c.SubscriptionsModel.GetTableName()).Rows(subscription).ToSQL()
if err != nil {
return err
}
r, err := session.ExecCtx(ctx, query)
if err != nil {
return err
}
subscription.Id, _ = r.LastInsertId()
query, _, err = goqu.Dialect("mysql").Update(c.UsersModel.GetTableName()).
Set(goqu.Record{"last_subscription_id": subscription.Id}).
Where(goqu.Ex{"id": user.Id}).
ToSQL()
if err != nil {
return err
}
_, err = session.ExecCtx(ctx, query)
if err != nil {
return err
}
return nil
})