package database import ( "gorm.io/driver/mysql" "gorm.io/gen" "gorm.io/gorm" "os" ) func generateGormDbModel(dsn string, daoPath string) { currentPath, _ := os.Getwd() db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{}) genConfig := gen.Config{ OutPath: currentPath + "/dao" + daoPath + "/query", ModelPkgPath: currentPath + "/dao" + daoPath + "/model", Mode: gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface, //// 表字段可为 null 值时, 对应结体字段使用指针类型 FieldNullable: false, // generate pointer when field is nullable // //// 表字段默认值与模型结构体字段零值不一致的字段, 在插入数据时需要赋值该字段值为零值的, 结构体字段须是指针类型才能成功, 即`FieldCoverable:true`配置下生成的结构体字段. //// 因为在插入时遇到字段为零值的会被GORM赋予默认值. 如字段`age`表默认值为10, 即使你显式设置为0最后也会被GORM设为10提交. //// 如果该字段没有上面提到的插入时赋零值的特殊需要, 则字段为非指针类型使用起来会比较方便. //FieldCoverable: false, // generate pointer when field has default value, to fix problem zero value cannot be assign: https://gorm.io/docs/create.html#Default-Values // //// 模型结构体字段的数字类型的符号表示是否与表字段的一致, `false`指示都用有符号类型 //FieldSignable: false, // detect integer field's unsigned type, adjust generated data type //// 生成 gorm 标签的字段索引属性 //FieldWithIndexTag: false, // generate with gorm index tag //// 生成 gorm 标签的字段类型属性 //FieldWithTypeTag: true, // generate with gorm column type tag } g := gen.NewGenerator(genConfig) g.WithImportPkgPath("github.com/shopspring/decimal") g.UseDB(db) // Add mapping for decimal(64,18) to decimal.Decimal // 自定义类型映射 dataMap := map[string]func(detailType gorm.ColumnType) (dataType string){ "tinyint": func(detailType gorm.ColumnType) (dataType string) { return "int64" }, "smallint": func(detailType gorm.ColumnType) (dataType string) { return "int64" }, "mediumint": func(detailType gorm.ColumnType) (dataType string) { return "int64" }, "bigint": func(detailType gorm.ColumnType) (dataType string) { return "int64" }, "int": func(detailType gorm.ColumnType) (dataType string) { return "int64" }, "decimal": func(detailType gorm.ColumnType) (dataType string) { return "decimal.Decimal" }, // 金额类型全部转换为第三方库,github.com/shopspring/decimal } g.WithDataTypeMap(dataMap) // 修改字段名,和系统关键字冲突 g.WithOpts(gen.FieldRename("table", "MTable")) g.GenerateAllTable() g.ApplyBasic(g.GenerateAllTable()...) g.Execute() }