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  }