package util import ( "bufio" "fmt" "os" "strings" "xorm.io/xorm" ) // const base_url = "E:\\project\\kkc\\kkc-go\\" const base_url = "D:\\project\\study\\kkc\\kkc-go\\" type MTable struct { Name string AaBbName string aaBbName string Comment string existId bool MColumns []MColumn } type MColumn struct { Name string //aa_bb AaBbName string aaBbName string Comment string SqlTypeName string TypeName string Length int64 Length2 int64 IsKey bool } func (receiver MTable) String() string { return fmt.Sprintf("Name:%s,Comment:%s,MColumns:%s\n\n\n", receiver.Name, receiver.Comment, receiver.MColumns) } func (receiver MColumn) String() string { return fmt.Sprintf("Name:%s,AaBbName:%s,aaBbName:%s,Comment:%s,SqlTypeName:%s,TypeName:%s,Length:%d,Length2:%d\n", receiver.Name, receiver.AaBbName, receiver.aaBbName, receiver.Comment, receiver.SqlTypeName, receiver.TypeName, receiver.Length, receiver.Length2) } var MTables = make([]MTable, 0) // InitMTableArray 初始化加载数据库结构并存储 func InitMTableArray(engine *xorm.Engine) { metas, err := engine.DBMetas() if err != nil { fmt.Println(err) } for _, meta := range metas { var mTable MTable mTable.Name = meta.Name mTable.AaBbName, mTable.aaBbName = formatName(meta.Name) mTable.Comment = meta.Comment var cols = meta.Columns() for i := range cols { var mColumn MColumn mColumn.Name = cols[i].Name mColumn.AaBbName, mColumn.aaBbName = formatName(cols[i].Name) mColumn.IsKey = cols[i].IsPrimaryKey if cols[i].IsPrimaryKey && cols[i].IsAutoIncrement { mTable.existId = true } mColumn.Comment = cols[i].Comment mColumn.SqlTypeName = cols[i].SQLType.Name mColumn.TypeName = formatSqlType(mColumn.SqlTypeName) mColumn.Length = cols[i].Length mColumn.Length2 = cols[i].Length2 mTable.MColumns = append(mTable.MColumns, mColumn) } MTables = append(MTables, mTable) fmt.Println(mTable) } } // 将名字修改成大驼峰和小驼峰的格式进行返回 func formatName(name string) (string, string) { split := strings.Split(strings.ToLower(name), "_") if len(split) == 1 { return strings.ToUpper(split[0][0:1]) + split[0][1:], split[0] } else { AaBb := "" aaBb := "" for j := range split { AaBb += strings.ToUpper(split[j][0:1]) + split[j][1:] if j == 0 { aaBb += split[j] } else { aaBb += strings.ToUpper(split[j][0:1]) + split[j][1:] } } return AaBb, aaBb } } // 修改mysql数据库对应的go类型 func formatSqlType(str string) string { str = strings.ToLower(str) switch str { case "varchar": return "string" case "int": return "int" case "decimal": return "float64" case "datetime": return "time.Time" case "longblob": return "string" default: panic("未定义的类型:" + str) } } //---------------------------------------------------------- // MysqlToStruct 根据mysql 生成对应的struct及String函数 func MysqlToStruct(engine *xorm.Engine) { InitMTableArray(engine) var structString = "" for _, mtable := range MTables { structString += fmt.Sprint("//", mtable.AaBbName, " ", mtable.Comment, "\n", "type ", mtable.AaBbName, " struct {\n") cols := mtable.MColumns var toString = "" for i := range cols { if cols[i].aaBbName == "id" && cols[i].IsKey { structString += fmt.Sprint(" ", cols[i].AaBbName, " ", cols[i].TypeName, " `json:\"", cols[i].aaBbName, "\"`", "// ", cols[i].Length, " ", cols[i].Length2, " 注释:", cols[i].Comment, "\n") toString += fmt.Sprint(cols[i].AaBbName, ":\", receiver.", cols[i].AaBbName, ", \",") } else { structString += fmt.Sprint(" ", cols[i].AaBbName, " ", cols[i].TypeName, " `xorm:\"", cols[i].Name, "\" json:\"", cols[i].aaBbName, "\"`", "// ", cols[i].Length, " ", cols[i].Length2, " 注释:", cols[i].Comment, "\n") toString += fmt.Sprint(cols[i].AaBbName, ":\", receiver.", cols[i].AaBbName, ", \",") } } structString += "}\n\n" structString += fmt.Sprint("func (receiver ", mtable.AaBbName, ") String() string {\n") structString += fmt.Sprint(" return fmt.Sprint(\"", mtable.AaBbName, "{", toString[0:len(toString)-1], "}\")\n}\n\n") fmt.Println(structString) } fileUrl := base_url + "\\data\\domain\\DoMain.go" //清空文件 os.Truncate(fileUrl, 0) file, _ := os.OpenFile(fileUrl, os.O_CREATE|os.O_RDWR, 0666) defer file.Close() writer := bufio.NewWriter(file) writer.WriteString("package domain\n\nimport (\n \"fmt\"\n \"time\"\n)\n\n") writer.WriteString(structString) writer.Flush() //file.Write([]byte("package domain\n\nimport \"time\"\n")) //file.Write([]byte(structString)) } // MysqlToDao 生成简单的CRUD dao层 func MysqlToDao(engine *xorm.Engine) { InitMTableArray(engine) var baseUrl = base_url + "data\\dao\\manage\\" tables := MTables for _, table := range tables { var dao = "" fileName := table.AaBbName + "Dao.go" dao += "package manage\n\nimport (\n\t\"demo/configs\"\n\t\"demo/data/domain\"\n\t\"demo/data/domain/vo\"\n)\n" //get if table.Name == "role_authority" { fmt.Println(table.existId, "====================>") } var idColumn MColumn for _, column := range table.MColumns { if column.IsKey { idColumn = column break } } //没有id的不适用 if table.existId { dao += "func GetById" + table.AaBbName + "(id int) (domain." + table.AaBbName + ", error) {" + "\n\tvar " + table.aaBbName + " domain." + table.AaBbName + "" + "\n\t_, err := configs.Engine.Where(\"id = ?\", id).Get(&" + table.aaBbName + ")" + "\n\tif err != nil {" + "\n\t\treturn " + table.aaBbName + ", err" + "\n\t}" + "\n\treturn " + table.aaBbName + ", nil" + "\n}\n\n" } dao += "func GetInIdList" + table.AaBbName + "(ids []int) ([]domain." + table.AaBbName + ", error) {" + "\n\trows, err := configs.Engine.In(\"id\", ids).Rows(&domain." + table.AaBbName + "{})" + "\n\tif err != nil {" + "\n\t\treturn make([]domain." + table.AaBbName + ", 0), err" + "\n\t}" + "\n\tdefer rows.Close()" + "\n\tvar list []domain." + table.AaBbName + "" + "\n\tfor rows.Next() {" + "\n\t\tvar u domain." + table.AaBbName + "" + "\n\t\tlist = append(list, u)" + "\n\t}" + "\n\treturn list, nil" + "\n}\n\n" //list dao += "func GetList" + table.AaBbName + "(" + table.aaBbName + " domain." + table.AaBbName + ", pageNum, pageSize int) (vo.BaseListVo, error) {" + "\n\tvar arr []domain." + table.AaBbName + "\n\tCount, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc(\"id\").FindAndCount(&arr, &" + table.aaBbName + ")" + "\n\tvar vo vo.BaseListVo" + "\n\tif err != nil {" + "\n\t\treturn vo, err" + "\n\t}" + "\n\tif err != nil {" + "\n\t\treturn vo, err" + "\n\t}" + "\n\tvo.PageNum = pageNum" + "\n\tvo.PageSize = pageSize" + "\n\tvo.List = make([]any, len(arr))" + "\n\tfor i, v := range arr {" + "\n\t\tvo.List[i] = v" + "\n\t}" + "\n\tvo.Total = int(Count)" + "\n\treturn vo, nil" + "\n}\n\n" dao += "func Save" + table.AaBbName + "(" + table.aaBbName + " *domain." + table.AaBbName + ") (domain." + table.AaBbName + ", error) {" + "\n\t_, err := configs.Engine.Insert(&" + table.aaBbName + ")" + "\n\tif err != nil {" + "\n\t\treturn *" + table.aaBbName + ", err" + "\n\t}" + "\n\treturn *" + table.aaBbName + ", nil" + "\n}\n\n" dao += "func Set" + table.AaBbName + "(" + table.aaBbName + "Map map[string]interface{}, id int) (domain." + table.AaBbName + ", bool, error) {" + "\n\tvar " + table.aaBbName + " domain." + table.AaBbName + "" + "\n\t_, err := configs.Engine.Table(\"" + table.Name + "\").Where(\"" + idColumn.Name + " = ?\", id).Update(" + table.aaBbName + "Map)" + "\n\tif err != nil {" + "\n\t\treturn " + table.aaBbName + ", false, err" + "\n\t}" + "\n\treturn " + table.aaBbName + ", true, nil" + "\n}\n\n" if table.existId { dao += "func Delete" + table.AaBbName + "(" + table.aaBbName + " domain." + table.AaBbName + ") bool {" + "\n\ti, err := configs.Engine.Where(\"id = ?\", " + table.aaBbName + ".Id).Delete(&" + table.aaBbName + ")" + "\n\tif err != nil {" + "\n\t\treturn false" + "\n\t}" + "\n\treturn i > 0" + "\n}" } //创建文件 url := baseUrl + fileName os.Truncate(url, 0) file, _ := os.OpenFile(url, os.O_CREATE|os.O_RDWR, 0666) writer := bufio.NewWriter(file) writer.WriteString(dao) writer.Flush() file.Close() } }