github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgSql/MysqlFieldType.go (about) 1 package kmgSql 2 3 import ( 4 "fmt" 5 "strconv" 6 "strings" 7 8 "github.com/bronze1man/kmg/kmgStrconv" 9 ) 10 11 type MysqlField struct { 12 Name string 13 Type MysqlFieldType 14 } 15 16 type MysqlFieldType struct { 17 DataType MysqlDataType 18 IsUnsigned bool 19 IsAutoIncrement bool 20 CharacterSetName string //utf8 21 CollationName string //utf8_bin 22 Default string 23 StringLength int 24 } 25 26 func (t1 MysqlFieldType) Equal(t2 MysqlFieldType) bool { 27 return t1 == t2 28 } 29 30 func (t1 MysqlFieldType) String() string { 31 out := string(t1.DataType) 32 if t1.StringLength != 0 { 33 out += "(" + strconv.Itoa(t1.StringLength) + ")" 34 } 35 if t1.IsUnsigned { 36 out += " unsigned" 37 } 38 if t1.IsAutoIncrement { 39 out += " auto_increment" 40 } 41 if t1.CollationName != "" { 42 out += " COLLATE " + t1.CollationName 43 } 44 switch t1.DataType { 45 case MysqlDataTypeInt32, MysqlDataTypeInt8, MysqlDataTypeFloat: 46 out += " DEFAULT " + strconv.Itoa(kmgStrconv.AtoIDefault0(t1.Default)) 47 case MysqlDataTypeVarchar, MysqlDataTypeDateTime: 48 out += " DEFAULT " + fmt.Sprintf("%#v", t1.Default) //TODO 正确的序列化方式 49 } 50 return out 51 } 52 53 type MysqlDataType string 54 55 const ( 56 MysqlDataTypeVarchar MysqlDataType = `varchar` 57 MysqlDataTypeInt32 MysqlDataType = `int` 58 MysqlDataTypeLongText MysqlDataType = `longtext` 59 MysqlDataTypeFloat MysqlDataType = `float` 60 MysqlDataTypeDateTime MysqlDataType = `datetime` 61 MysqlDataTypeInt8 MysqlDataType = `tinyint` 62 MysqlDataTypeLongBlob MysqlDataType = `longblob` 63 ) 64 65 func mustMysqlGetTableFieldTypeList(TableName string) (out []MysqlField) { 66 fieldRowList := MustQuery(`SELECT * FROM INFORMATION_SCHEMA.COLUMNS 67 WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?`, GetDefaultDbConfig().DbName, TableName) 68 for _, row := range fieldRowList { 69 field := MysqlFieldType{} 70 field.DataType = MysqlDataType(row["DATA_TYPE"]) 71 field.Default = row["COLUMN_DEFAULT"] 72 switch field.DataType { 73 case MysqlDataTypeVarchar: 74 field.CharacterSetName = row["CHARACTER_SET_NAME"] 75 field.CollationName = row["COLLATION_NAME"] 76 field.StringLength = kmgStrconv.AtoIDefault0(row["CHARACTER_MAXIMUM_LENGTH"]) 77 case MysqlDataTypeLongText: 78 field.CharacterSetName = row["CHARACTER_SET_NAME"] 79 field.CollationName = row["COLLATION_NAME"] 80 case MysqlDataTypeInt32, MysqlDataTypeInt8: 81 field.IsUnsigned = strings.Contains(row["COLUMN_TYPE"], "unsigned") 82 field.IsAutoIncrement = strings.Contains(row["EXTRA"], "auto_increment") 83 case MysqlDataTypeDateTime, MysqlDataTypeFloat, MysqlDataTypeLongBlob: 84 default: 85 panic(fmt.Errorf("TODO implement MysqlDataType %s", field.DataType)) 86 } 87 out = append(out, MysqlField{ 88 Name: row["COLUMN_NAME"], 89 Type: field, 90 }) 91 } 92 return out 93 }