[zeromicro/go-zero]goctl model mysql ddl生成shorturl.sql 字段类型是 sql.NullString,不是string.

2024-02-18 356 views
4

我按照文档 生成 goctl model mysql ddl -c -src shorturl.sql -dir . model中

type (
    ShorturlModel interface {
        Insert(data Shorturl) (sql.Result, error)
        FindOne(shorten sql.NullString) (*Shorturl, error)
        Update(data Shorturl) error
        Delete(shorten sql.NullString) error
    }

    defaultShorturlModel struct {
        sqlc.CachedConn
        table string
    }

    Shorturl struct {
        Shorten sql.NullString `db:"shorten"` // shorten key
        Url     sql.NullString `db:"url"`     // original url
    }
)

字段不是 string类型. 需要转换 sql如下

CREATE TABLE `shorturl`
(
  `shorten` varchar(255) NOT NULL COMMENT 'shorten key',
  `url` varchar(255) NOT NULL COMMENT 'original url',
  PRIMARY KEY(`shorten`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

这个地方为什么不是 string类型.

回答

4

我今天看代码也遇到了,我是用goctl 1.1.10 因该是版本问题, example 的go.mod 有列出依赖的版本, 我刚刚重新用goctl 1.1.6 生成的model文件就和例子中的一致了

8

我调整了demo里面的代码,也是可用的 expandlogic.go

func (l *ExpandLogic) Expand(in *transform.ExpandReq) (*transform.ExpandResp, error) {
    // todo: add your logic here and delete this line

    res, err := l.svcCtx.Model.FindOne(sql.NullString{
        String: in.Shorten,
        Valid:  true,
    })
    if err != nil {
        return nil, err
    }

    return &transform.ExpandResp{
        Url: res.Url.String,
    }, nil
}

shortenlogic.go


func (l *ShortenLogic) Shorten(in *transform.ShortenReq) (*transform.ShortenResp, error) {
    // todo: add your logic here and delete this line
    key := hash.Md5Hex([]byte(in.Url))[:6]
    _, err := l.svcCtx.Model.Insert(model.Shorturl{
        Shorten: sql.NullString{
            String: key,
            Valid:  true,
        },
        Url: sql.NullString{
            String: in.Url,
            Valid:  true,
        },
    })
    if err != nil {
        return nil, err
    }

    return &transform.ShortenResp{
        Shorten: key,
    }, nil
}