|
|
@@ -0,0 +1,255 @@
|
|
|
+package util
|
|
|
+
|
|
|
+import (
|
|
|
+ "bufio"
|
|
|
+ "fmt"
|
|
|
+ "os"
|
|
|
+ "strings"
|
|
|
+ "xorm.io/xorm"
|
|
|
+)
|
|
|
+
|
|
|
+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)
|
|
|
+
|
|
|
+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
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+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 := "E:\\project\\kkc\\kkc-go\\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))
|
|
|
+}
|
|
|
+
|
|
|
+func MysqlToDao(engine *xorm.Engine) {
|
|
|
+ InitMTableArray(engine)
|
|
|
+ var baseUrl = "E:\\project\\kkc\\kkc-go\\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
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ 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\trows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc(\"id\").Rows(&" + table.aaBbName + ")" +
|
|
|
+ "\n\tvar vo vo.BaseListVo" +
|
|
|
+ "\n\tif err != nil {" +
|
|
|
+ "\n\t\treturn vo, err" +
|
|
|
+ "\n\t}" +
|
|
|
+ "\n\tvo.PageNum = pageNum" +
|
|
|
+ "\n\tvo.PageSize = pageSize" +
|
|
|
+ "\n\tvo.List = make([]any, 0)" +
|
|
|
+ "\n\tfor rows.Next() {" +
|
|
|
+ "\n\t\tvar u domain." + table.AaBbName +
|
|
|
+ "\n\t\trows.Scan(&u)" +
|
|
|
+ "\n\t\tvo.List = append(vo.List, u)" +
|
|
|
+ "\n\t}" +
|
|
|
+ "\n\t//查询数量" +
|
|
|
+ "\n\tcount, err := configs.Engine.Count(&" + table.aaBbName + ")" +
|
|
|
+ "\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()
|
|
|
+ }
|
|
|
+
|
|
|
+}
|