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  }