mono code generation

mono code generation

Overview

The mono code is generated by goctl generating model files with the specified document name. The mono does not have form statements like mysql, indexes, and so forth, so mono code generation does not need information like sql or database links.

Task Targets

  1. familiar with goctl generating mono code usage and learn about currently supported instructions and features
  2. Preliminary understanding of the format of goctl generating mono code

Preparing

  1. Complete golang installation
  2. Complete goctl installation

Code Generation

## Create workspaces and projects
$ mkdir -p ~/workspace/model/mongo && ~/workspace/model/mongo
## Generate mongo code with document name User
$ goctl model mongo --type user --dir .
## View generated files
$ ls
error.go        usermodel.go    usermodelgen.go usertypes.go
## view directory tree
.
├── error.go
├── usermodel.go
├── usermodelgen.go
└── usertypes.go

0 directories, 4 files

View code

  • error.go
  • usermodel.go
  • usermodelgen.go
  • usertypes.go
package model

import (
    "errors"

    "github.com/zeromicro/go-zero/core/stores/mon"
)

var (
    ErrNotFound        = mon.ErrNotFound
    ErrInvalidObjectId = errors.New("invalid objectId")
)
``` ```
package model

import "github.com/zeromicro/go-zero/core/stores/mon"

var _ UserModel = (*customUserModel)(nil)

type (
    // UserModel is an interface to be customized, add more methods here,
    // and implement the added methods in customUserModel.
    UserModel interface {
        userModel
    }

    customUserModel struct {
        *defaultUserModel
    }
)

// NewUserModel returns a model for the mongo.
func NewUserModel(url, db, collection string) UserModel {
    conn := mon.MustNewModel(url, db, collection)
    return &customUserModel{
        defaultUserModel: newDefaultUserModel(conn),
    }
}
``` ```
// Code generated by goctl. DO NOT EDIT.
package model

import (
    "context"
    "time"

    "github.com/zeromicro/go-zero/core/stores/mon"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/primitive"
)

type userModel interface {
    Insert(ctx context.Context, data *User) error
    FindOne(ctx context.Context, id string) (*User, error)
    Update(ctx context.Context, data *User) error
    Delete(ctx context.Context, id string) error
}

type defaultUserModel struct {
    conn *mon.Model
}

func newDefaultUserModel(conn *mon.Model) *defaultUserModel {
    return &defaultUserModel{conn: conn}
}

func (m *defaultUserModel) Insert(ctx context.Context, data *User) error {
    if data.ID.IsZero() {
        data.ID = primitive.NewObjectID()
        data.CreateAt = time.Now()
        data.UpdateAt = time.Now()
    }

    _, err := m.conn.InsertOne(ctx, data)
    return err
}

func (m *defaultUserModel) FindOne(ctx context.Context, id string) (*User, error) {
    oid, err := primitive.ObjectIDFromHex(id)
    if err != nil {
        return nil, ErrInvalidObjectId
    }

    var data User

    err = m.conn.FindOne(ctx, &data, bson.M{"_id": oid})
    switch err {
    case nil:
        return &data, nil
    case mon.ErrNotFound:
        return nil, ErrNotFound
    default:
        return nil, err
    }
}

func (m *defaultUserModel) Update(ctx context.Context, data *User) error {
    data.UpdateAt = time.Now()

    _, err := m.conn.ReplaceOne(ctx, bson.M{"_id": data.ID}, data)
    return err
}

func (m *defaultUserModel) Delete(ctx context.Context, id string) error {
    oid, err := primitive.ObjectIDFromHex(id)
    if err != nil {
        return ErrInvalidObjectId
    }

    _, err = m.conn.DeleteOne(ctx, bson.M{"_id": oid})
    return err
}
``` ```
package model

import (
    "time"

    "go.mongodb.org/mongo-driver/bson/primitive"
)

type User struct {
    ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
    // TODO: Fill your own fields
    UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
    CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
}

References