github.com/iEvan-lhr/exciting-tool@v0.0.0-20230504054234-8e983f73cdd2/sql_tool.go (about) 1 package tools 2 3 import ( 4 "bytes" 5 "reflect" 6 "time" 7 ) 8 9 // humpName 格式化驼峰命名 10 func humpName(buf string) (ans []byte) { 11 if len(buf) > 0 { 12 for i := range buf { 13 if buf[i] < 97 { 14 if i == 0 { 15 ans = append(ans, buf[0]+32) 16 } else { 17 ans = append(ans, sli) 18 ans = append(ans, buf[i]+32) 19 } 20 } else { 21 ans = append(ans, buf[i]) 22 } 23 } 24 } 25 return 26 } 27 28 func righteousCharacter(s *String) *String { 29 var runes []rune 30 for _, v := range bytes.Runes(s.buf) { 31 if v == '\'' || v == '`' { 32 runes = append(runes, append([]rune(`\`), v)...) 33 } else { 34 runes = append(runes, v) 35 } 36 } 37 s.runes = runes 38 s.buf = runesToBytes(s.Runes()) 39 return s 40 } 41 42 func marshalTable(model any) *String { 43 values, typ := returnValAndTyp(model) 44 if values.Kind() == reflect.Struct { 45 return saveTable(values, typ) 46 } else { 47 panic("unsupported type for marshalTable : has to be struct") 48 } 49 } 50 51 func saveTable(values reflect.Value, types reflect.Type) *String { 52 s := Make("CREATE TABLE `") 53 s.cutHumpMessage(values.String()) 54 s.appendAny("` (\n") 55 for j := 0; j < types.NumField(); j++ { 56 s.Append(humpName(types.Field(j).Name), " ", returnType(values.Field(j))) 57 switch types.Field(j).Tag.Get("marshal") { 58 case "pro": 59 s.Append("` primary key") 60 case "default": 61 s.appendAny(" " + types.Field(j).Tag.Get("default") + "\n") 62 case "": 63 64 } 65 s.appendAny(",\n") 66 } 67 s.ReplaceLastStr(2, "\n)") 68 return s 69 } 70 71 func returnType(typ reflect.Value) string { 72 switch typ.Kind() { 73 case 24: 74 return "varchar(200)" 75 case 2, 3, 4, 5, 6, 7, 8, 9, 10, 11: 76 return "int" 77 case 13, 14: 78 return "float" 79 case 25: 80 switch typ.Interface().(type) { 81 case time.Time: 82 return "Data" 83 } 84 } 85 return "" 86 }