Skip to end of metadata
Go to start of metadata

最新的CLI工具版本功能会随着GoFrame框架的最新版本编译,引入如果本地的CLI工具自动化生成的代码与项目的GoFrame框架版本出现兼容性问题时,建议升级项目框架版本,或者自定义安装旧版本的CLI工具。旧版本CLI工具安装方式参考仓库首页介绍:https://github.com/gogf/gf-cli

使用方式

$ gf gen -h
USAGE
    gf gen TYPE [OPTION]

TYPE
    dao        generate dao and model files.
    pb         parse proto files and generate protobuf go files.
    pbentity   generate entity message files in protobuf3 format.

DESCRIPTION
    The "gen" command is designed for multiple generating purposes.
    It's currently supporting generating go files for ORM models, protobuf and protobuf entity files.
    Please use "gf gen dao -h" or "gf gen model -h" for specified type help.

注意事项

gen 命令涉及到数据访问相关代码生成时,默认支持的数据库类型为:MySQL/MariaDBPostgreSQLSQLServer

如果需要SQLiteOracle数据库类型支持,需要开发者自己修改源码文件后自行本地手动编译生成CLI工具随后安装,因为这两个数据库的驱动需要CGO支持,无法预编译生成给大家直接使用。




  • No labels

10 Comments

  1. gf gen dao生成代码的时候,遇到int64类型能否指定json转换的时候转化为字符串?每次都要修改这个,要不然js里面读取的时候精度不够,好麻烦。

    1. 如果有定制化的需求,你可以给对应的结构体实现 MarshalJSON() ([]byte, error) 接口即可,例如:

  2. model的这个设计方便统一管理对象

    但外层文件统一一层目录这个设计极容易造成类型名冲突

    自定义的数据结构都放在一层文件夹,也不方便进行版本控制。

    但这层文件还不能删除,因为Dao层还需要引用。

    建议Dao层直接引用mobel的internal内部暴漏的公共对象

    model外层文件可以根据需要自行组织结构

    现在的外层是食之无味,弃之有肉。





    1. 1、model中的internal用于工具自动化生成的数据模型存储,由工具来维护,多次生成会覆盖的,开发者不能修改。

      2、model外层目录采用的同一个包来管理模型,而不是内部再分成多个包,其实想要解决的是之前gen model存在的痛点:

      • 包名太多,不好维护。且在每一层的代码中,包名容易冲突,例如api/service/dao中可能都会存在同样一个包名叫做user,引用时容易混淆,降低开发维护效率。
      • 统一包名可以在一个包名下查找所有的、公开的资源,不用考虑包名命名问题,方便统一维护,减少心智负担。
      • 不同的数据结构之间存在复用的可能(例如api/service/dao的输入输出参数),多个包的话复用比较困难,造成代码冗余,不好维护。

      3、在不同的代码分层中,可以依靠不同的命名规范来区别不同业务的资源,不同的业务资源也可以在同一个包/目录下使用不同的文件来进行管理。


  3. 没有办法设置某个字段不输出json吗?

    1. 当然可以的,参考下:对象封装设计

  4. sqlite 的自增 ID,使用 dao.Info.Insert() 的时候,id 也会被带进去,始终是0,sqlite 会报错,请问有解决方案吗?


    create table info
    (
        id integer
            constraint license_pk
                primary key autoincrement,
        created_at datetime,
        modified_at datetime,
        enabled int,
        content int
    );
    
    INSERT INTO `info`(`id`,`created_at`,`modified_at`,`enabled`,`content`) 
    VALUES(0,'2021-08-11 22:26:49',null,1,'5FC7EC');



  5. 刚接触2天gf,在学习gf-demos,发现新工具生成的dao内容和demos里的不一样。

    GoFrame CLI Tool v1.17.0, https://goframe.org 
    GoFrame Version: v1.16.5 in current go.mod 
    CLI Installed At: H:\go\path\bin\gf.exe 
    CLI Built Detail:
      Go Version:  go1.15.14
      GF Version:  v1.16.4
      Git Commit:  971ed46f0b9d4dfebd1907cd3ed851cf9e1a5503
      Build Time:  2021-08-10 02:22:48 


    在serveice/user.go中抄了一段类似的代码报错了

    ```

    // 用户邮箱加密码登录,成功返回用户信息,否则返回nil; password应当会md5值字符串
    func (s *userinfoService) SignIn(ctx context.Context, email, password stringerror {
        var user *model.UserInfo
        err := dao.UserInfo.Where("email=? and password=?", email, password).Scan(&user)
        if err != nil {
            return err
        }
        if user == nil {
            return errors.New("账号或密码错误")
        }
        if err := Session.SetUser(ctx, user); err != nil {
            return err
        }
        Context.SetUser(ctx, &model.ContextUser{
            Uid:      uint(user.Uid),
            Wxamp:    user.Wxamp,
            Username: user.Username,
        })
        return nil
    }

    ```

    1. 好像是

      err := dao.UserInfo.Ctx(ctx).Where("email=? and password=?", email, password).Scan(&user)

  6. func (dao *ProductLabelDao) Transaction(ctx context.Context, f func(ctx context.Context, tx *gdb.TX) error) (err error) {
    return dao.Ctx(ctx).Transaction(ctx, f)
    }
    Transaction 提示没有这个方法,不知道是怎么回事。自动生成的代码。是什么原因呀。