MysqlToStruct.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. package util
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. "strings"
  7. "xorm.io/xorm"
  8. )
  9. // const base_url = "E:\\project\\kkc\\kkc-go\\"
  10. const base_url = "D:\\project\\study\\kkc\\kkc-go\\"
  11. type MTable struct {
  12. Name string
  13. AaBbName string
  14. aaBbName string
  15. Comment string
  16. existId bool
  17. MColumns []MColumn
  18. }
  19. type MColumn struct {
  20. Name string //aa_bb
  21. AaBbName string
  22. aaBbName string
  23. Comment string
  24. SqlTypeName string
  25. TypeName string
  26. Length int64
  27. Length2 int64
  28. IsKey bool
  29. }
  30. func (receiver MTable) String() string {
  31. return fmt.Sprintf("Name:%s,Comment:%s,MColumns:%s\n\n\n", receiver.Name, receiver.Comment, receiver.MColumns)
  32. }
  33. func (receiver MColumn) String() string {
  34. return fmt.Sprintf("Name:%s,AaBbName:%s,aaBbName:%s,Comment:%s,SqlTypeName:%s,TypeName:%s,Length:%d,Length2:%d\n",
  35. receiver.Name, receiver.AaBbName, receiver.aaBbName, receiver.Comment, receiver.SqlTypeName, receiver.TypeName, receiver.Length, receiver.Length2)
  36. }
  37. var MTables = make([]MTable, 0)
  38. // InitMTableArray 初始化加载数据库结构并存储
  39. func InitMTableArray(engine *xorm.Engine) {
  40. metas, err := engine.DBMetas()
  41. if err != nil {
  42. fmt.Println(err)
  43. }
  44. for _, meta := range metas {
  45. var mTable MTable
  46. mTable.Name = meta.Name
  47. mTable.AaBbName, mTable.aaBbName = formatName(meta.Name)
  48. mTable.Comment = meta.Comment
  49. var cols = meta.Columns()
  50. for i := range cols {
  51. var mColumn MColumn
  52. mColumn.Name = cols[i].Name
  53. mColumn.AaBbName, mColumn.aaBbName = formatName(cols[i].Name)
  54. mColumn.IsKey = cols[i].IsPrimaryKey
  55. if cols[i].IsPrimaryKey && cols[i].IsAutoIncrement {
  56. mTable.existId = true
  57. }
  58. mColumn.Comment = cols[i].Comment
  59. mColumn.SqlTypeName = cols[i].SQLType.Name
  60. mColumn.TypeName = formatSqlType(mColumn.SqlTypeName)
  61. mColumn.Length = cols[i].Length
  62. mColumn.Length2 = cols[i].Length2
  63. mTable.MColumns = append(mTable.MColumns, mColumn)
  64. }
  65. MTables = append(MTables, mTable)
  66. fmt.Println(mTable)
  67. }
  68. }
  69. // 将名字修改成大驼峰和小驼峰的格式进行返回
  70. func formatName(name string) (string, string) {
  71. split := strings.Split(strings.ToLower(name), "_")
  72. if len(split) == 1 {
  73. return strings.ToUpper(split[0][0:1]) + split[0][1:], split[0]
  74. } else {
  75. AaBb := ""
  76. aaBb := ""
  77. for j := range split {
  78. AaBb += strings.ToUpper(split[j][0:1]) + split[j][1:]
  79. if j == 0 {
  80. aaBb += split[j]
  81. } else {
  82. aaBb += strings.ToUpper(split[j][0:1]) + split[j][1:]
  83. }
  84. }
  85. return AaBb, aaBb
  86. }
  87. }
  88. // 修改mysql数据库对应的go类型
  89. func formatSqlType(str string) string {
  90. str = strings.ToLower(str)
  91. switch str {
  92. case "varchar":
  93. return "string"
  94. case "int":
  95. return "int"
  96. case "decimal":
  97. return "float64"
  98. case "datetime":
  99. return "time.Time"
  100. case "longblob":
  101. return "string"
  102. default:
  103. panic("未定义的类型:" + str)
  104. }
  105. }
  106. //----------------------------------------------------------
  107. // MysqlToStruct 根据mysql 生成对应的struct及String函数
  108. func MysqlToStruct(engine *xorm.Engine) {
  109. InitMTableArray(engine)
  110. var structString = ""
  111. for _, mtable := range MTables {
  112. structString += fmt.Sprint("//", mtable.AaBbName, " ", mtable.Comment, "\n",
  113. "type ", mtable.AaBbName, " struct {\n")
  114. cols := mtable.MColumns
  115. var toString = ""
  116. for i := range cols {
  117. if cols[i].aaBbName == "id" && cols[i].IsKey {
  118. structString += fmt.Sprint(" ", cols[i].AaBbName, " ", cols[i].TypeName, " `json:\"", cols[i].aaBbName, "\"`",
  119. "// ", cols[i].Length, " ", cols[i].Length2, " 注释:", cols[i].Comment, "\n")
  120. toString += fmt.Sprint(cols[i].AaBbName, ":\", receiver.", cols[i].AaBbName, ", \",")
  121. } else {
  122. structString += fmt.Sprint(" ", cols[i].AaBbName, " ", cols[i].TypeName, " `xorm:\"", cols[i].Name, "\" json:\"", cols[i].aaBbName, "\"`",
  123. "// ", cols[i].Length, " ", cols[i].Length2, " 注释:", cols[i].Comment, "\n")
  124. toString += fmt.Sprint(cols[i].AaBbName, ":\", receiver.", cols[i].AaBbName, ", \",")
  125. }
  126. }
  127. structString += "}\n\n"
  128. structString += fmt.Sprint("func (receiver ", mtable.AaBbName, ") String() string {\n")
  129. structString += fmt.Sprint(" return fmt.Sprint(\"", mtable.AaBbName, "{", toString[0:len(toString)-1], "}\")\n}\n\n")
  130. fmt.Println(structString)
  131. }
  132. fileUrl := base_url + "\\data\\domain\\DoMain.go"
  133. //清空文件
  134. os.Truncate(fileUrl, 0)
  135. file, _ := os.OpenFile(fileUrl, os.O_CREATE|os.O_RDWR, 0666)
  136. defer file.Close()
  137. writer := bufio.NewWriter(file)
  138. writer.WriteString("package domain\n\nimport (\n \"fmt\"\n \"time\"\n)\n\n")
  139. writer.WriteString(structString)
  140. writer.Flush()
  141. //file.Write([]byte("package domain\n\nimport \"time\"\n"))
  142. //file.Write([]byte(structString))
  143. }
  144. // MysqlToDao 生成简单的CRUD dao层
  145. func MysqlToDao(engine *xorm.Engine) {
  146. InitMTableArray(engine)
  147. var baseUrl = base_url + "data\\dao\\manage\\"
  148. tables := MTables
  149. for _, table := range tables {
  150. var dao = ""
  151. fileName := table.AaBbName + "Dao.go"
  152. dao += "package manage\n\nimport (\n\t\"demo/configs\"\n\t\"demo/data/domain\"\n\t\"demo/data/domain/vo\"\n)\n"
  153. //get
  154. if table.Name == "role_authority" {
  155. fmt.Println(table.existId, "====================>")
  156. }
  157. var idColumn MColumn
  158. for _, column := range table.MColumns {
  159. if column.IsKey {
  160. idColumn = column
  161. break
  162. }
  163. }
  164. //没有id的不适用
  165. if table.existId {
  166. dao += "func GetById" + table.AaBbName + "(id int) (domain." + table.AaBbName + ", error) {" +
  167. "\n\tvar " + table.aaBbName + " domain." + table.AaBbName + "" +
  168. "\n\t_, err := configs.Engine.Where(\"id = ?\", id).Get(&" + table.aaBbName + ")" +
  169. "\n\tif err != nil {" +
  170. "\n\t\treturn " + table.aaBbName + ", err" +
  171. "\n\t}" +
  172. "\n\treturn " + table.aaBbName + ", nil" +
  173. "\n}\n\n"
  174. }
  175. dao += "func GetInIdList" + table.AaBbName + "(ids []int) ([]domain." + table.AaBbName + ", error) {" +
  176. "\n\trows, err := configs.Engine.In(\"id\", ids).Rows(&domain." + table.AaBbName + "{})" +
  177. "\n\tif err != nil {" +
  178. "\n\t\treturn make([]domain." + table.AaBbName + ", 0), err" +
  179. "\n\t}" +
  180. "\n\tdefer rows.Close()" +
  181. "\n\tvar list []domain." + table.AaBbName + "" +
  182. "\n\tfor rows.Next() {" +
  183. "\n\t\tvar u domain." + table.AaBbName + "" +
  184. "\n\t\tlist = append(list, u)" +
  185. "\n\t}" +
  186. "\n\treturn list, nil" +
  187. "\n}\n\n"
  188. //list
  189. dao += "func GetList" + table.AaBbName + "(" + table.aaBbName + " domain." + table.AaBbName + ", pageNum, pageSize int) (vo.BaseListVo, error) {" +
  190. "\n\tvar arr []domain." + table.AaBbName +
  191. "\n\tCount, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc(\"id\").FindAndCount(&arr, &" + table.aaBbName + ")" +
  192. "\n\tvar vo vo.BaseListVo" +
  193. "\n\tif err != nil {" +
  194. "\n\t\treturn vo, err" +
  195. "\n\t}" +
  196. "\n\tif err != nil {" +
  197. "\n\t\treturn vo, err" +
  198. "\n\t}" +
  199. "\n\tvo.PageNum = pageNum" +
  200. "\n\tvo.PageSize = pageSize" +
  201. "\n\tvo.List = make([]any, len(arr))" +
  202. "\n\tfor i, v := range arr {" +
  203. "\n\t\tvo.List[i] = v" +
  204. "\n\t}" +
  205. "\n\tvo.Total = int(Count)" +
  206. "\n\treturn vo, nil" +
  207. "\n}\n\n"
  208. dao += "func Save" + table.AaBbName + "(" + table.aaBbName + " *domain." + table.AaBbName + ") (domain." + table.AaBbName + ", error) {" +
  209. "\n\t_, err := configs.Engine.Insert(&" + table.aaBbName + ")" +
  210. "\n\tif err != nil {" +
  211. "\n\t\treturn *" + table.aaBbName + ", err" +
  212. "\n\t}" +
  213. "\n\treturn *" + table.aaBbName + ", nil" +
  214. "\n}\n\n"
  215. dao += "func Set" + table.AaBbName + "(" + table.aaBbName + "Map map[string]interface{}, id int) (domain." + table.AaBbName + ", bool, error) {" +
  216. "\n\tvar " + table.aaBbName + " domain." + table.AaBbName + "" +
  217. "\n\t_, err := configs.Engine.Table(\"" + table.Name + "\").Where(\"" + idColumn.Name + " = ?\", id).Update(" + table.aaBbName + "Map)" +
  218. "\n\tif err != nil {" +
  219. "\n\t\treturn " + table.aaBbName + ", false, err" +
  220. "\n\t}" +
  221. "\n\treturn " + table.aaBbName + ", true, nil" +
  222. "\n}\n\n"
  223. if table.existId {
  224. dao += "func Delete" + table.AaBbName + "(" + table.aaBbName + " domain." + table.AaBbName + ") bool {" +
  225. "\n\ti, err := configs.Engine.Where(\"id = ?\", " + table.aaBbName + ".Id).Delete(&" + table.aaBbName + ")" +
  226. "\n\tif err != nil {" +
  227. "\n\t\treturn false" +
  228. "\n\t}" +
  229. "\n\treturn i > 0" +
  230. "\n}"
  231. }
  232. //创建文件
  233. url := baseUrl + fileName
  234. os.Truncate(url, 0)
  235. file, _ := os.OpenFile(url, os.O_CREATE|os.O_RDWR, 0666)
  236. writer := bufio.NewWriter(file)
  237. writer.WriteString(dao)
  238. writer.Flush()
  239. file.Close()
  240. }
  241. }