* g4 code generation * Update grammar * g4 code generation * fix #2108 * fix #2102 * Remove comments
This commit is contained in:
@@ -7,6 +7,14 @@ import (
|
||||
"github.com/zeromicro/ddl-parser/parser"
|
||||
)
|
||||
|
||||
var unsignedTypeMap = map[string]string{
|
||||
"int": "uint",
|
||||
"int8": "uint8",
|
||||
"int16": "uint16",
|
||||
"in32t": "uint32",
|
||||
"int64": "uint64",
|
||||
}
|
||||
|
||||
var commonMysqlDataTypeMapInt = map[int]string{
|
||||
// For consistency, all integer types are converted to int64
|
||||
// number
|
||||
@@ -124,27 +132,33 @@ var commonMysqlDataTypeMapString = map[string]string{
|
||||
}
|
||||
|
||||
// ConvertDataType converts mysql column type into golang type
|
||||
func ConvertDataType(dataBaseType int, isDefaultNull bool) (string, error) {
|
||||
func ConvertDataType(dataBaseType int, isDefaultNull, unsigned bool) (string, error) {
|
||||
tp, ok := commonMysqlDataTypeMapInt[dataBaseType]
|
||||
if !ok {
|
||||
return "", fmt.Errorf("unsupported database type: %v", dataBaseType)
|
||||
}
|
||||
|
||||
return mayConvertNullType(tp, isDefaultNull), nil
|
||||
return mayConvertNullType(tp, isDefaultNull, unsigned), nil
|
||||
}
|
||||
|
||||
// ConvertStringDataType converts mysql column type into golang type
|
||||
func ConvertStringDataType(dataBaseType string, isDefaultNull bool) (string, error) {
|
||||
func ConvertStringDataType(dataBaseType string, isDefaultNull, unsigned bool) (string, error) {
|
||||
tp, ok := commonMysqlDataTypeMapString[strings.ToLower(dataBaseType)]
|
||||
if !ok {
|
||||
return "", fmt.Errorf("unsupported database type: %s", dataBaseType)
|
||||
}
|
||||
|
||||
return mayConvertNullType(tp, isDefaultNull), nil
|
||||
return mayConvertNullType(tp, isDefaultNull, unsigned), nil
|
||||
}
|
||||
|
||||
func mayConvertNullType(goDataType string, isDefaultNull bool) string {
|
||||
func mayConvertNullType(goDataType string, isDefaultNull, unsigned bool) string {
|
||||
if !isDefaultNull {
|
||||
if unsigned {
|
||||
ret, ok := unsignedTypeMap[goDataType]
|
||||
if ok {
|
||||
return ret
|
||||
}
|
||||
}
|
||||
return goDataType
|
||||
}
|
||||
|
||||
@@ -162,6 +176,12 @@ func mayConvertNullType(goDataType string, isDefaultNull bool) string {
|
||||
case "time.Time":
|
||||
return "sql.NullTime"
|
||||
default:
|
||||
if unsigned {
|
||||
ret, ok := unsignedTypeMap[goDataType]
|
||||
if ok {
|
||||
return ret
|
||||
}
|
||||
}
|
||||
return goDataType
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,19 +8,23 @@ import (
|
||||
)
|
||||
|
||||
func TestConvertDataType(t *testing.T) {
|
||||
v, err := ConvertDataType(parser.TinyInt, false)
|
||||
v, err := ConvertDataType(parser.TinyInt, false, false)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "int64", v)
|
||||
|
||||
v, err = ConvertDataType(parser.TinyInt, true)
|
||||
v, err = ConvertDataType(parser.TinyInt, false, true)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "uint64", v)
|
||||
|
||||
v, err = ConvertDataType(parser.TinyInt, true, false)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "sql.NullInt64", v)
|
||||
|
||||
v, err = ConvertDataType(parser.Timestamp, false)
|
||||
v, err = ConvertDataType(parser.Timestamp, false, false)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "time.Time", v)
|
||||
|
||||
v, err = ConvertDataType(parser.Timestamp, true)
|
||||
v, err = ConvertDataType(parser.Timestamp, true, false)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "sql.NullTime", v)
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ CREATE TABLE `user`
|
||||
`id` bigint(10) NOT NULL AUTO_INCREMENT,
|
||||
`user` varchar(50) NOT NULL DEFAULT '' COMMENT '用户',
|
||||
`name` varchar(255) COLLATE utf8mb4_general_ci NULL COMMENT '用户\t名称',
|
||||
`age` tinyint(3) unsigned NOT NULL DEFAULT 0 COMMENT '年龄',
|
||||
`password` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户\n密码',
|
||||
`mobile` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '手机号',
|
||||
`gender` char(5) COLLATE utf8mb4_general_ci NOT NULL COMMENT '男|女|未公\r开',
|
||||
@@ -21,7 +22,7 @@ CREATE TABLE `user`
|
||||
|
||||
CREATE TABLE `student`
|
||||
(
|
||||
`type` bigint NOT NULL,
|
||||
`type` bigint NOT NULL,
|
||||
`class` varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
|
||||
`name` varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
|
||||
`age` tinyint DEFAULT NULL,
|
||||
|
||||
@@ -26,6 +26,7 @@ type (
|
||||
DbColumn struct {
|
||||
Name string `db:"COLUMN_NAME"`
|
||||
DataType string `db:"DATA_TYPE"`
|
||||
ColumnType string `db:"COLUMN_TYPE"`
|
||||
Extra string `db:"EXTRA"`
|
||||
Comment string `db:"COLUMN_COMMENT"`
|
||||
ColumnDefault interface{} `db:"COLUMN_DEFAULT"`
|
||||
@@ -87,7 +88,7 @@ func (m *InformationSchemaModel) GetAllTables(database string) ([]string, error)
|
||||
|
||||
// FindColumns return columns in specified database and table
|
||||
func (m *InformationSchemaModel) FindColumns(db, table string) (*ColumnData, error) {
|
||||
querySql := `SELECT c.COLUMN_NAME,c.DATA_TYPE,EXTRA,c.COLUMN_COMMENT,c.COLUMN_DEFAULT,c.IS_NULLABLE,c.ORDINAL_POSITION from COLUMNS c WHERE c.TABLE_SCHEMA = ? and c.TABLE_NAME = ? `
|
||||
querySql := `SELECT c.COLUMN_NAME,c.DATA_TYPE,c.COLUMN_TYPE,EXTRA,c.COLUMN_COMMENT,c.COLUMN_DEFAULT,c.IS_NULLABLE,c.ORDINAL_POSITION from COLUMNS c WHERE c.TABLE_SCHEMA = ? and c.TABLE_NAME = ? `
|
||||
var reply []*DbColumn
|
||||
err := m.conn.QueryRowsPartial(&reply, querySql, db, table)
|
||||
if err != nil {
|
||||
|
||||
@@ -219,7 +219,7 @@ func convertColumns(columns []*parser.Column, primaryColumn string) (Primary, ma
|
||||
}
|
||||
}
|
||||
|
||||
dataType, err := converter.ConvertDataType(column.DataType.Type(), isDefaultNull)
|
||||
dataType, err := converter.ConvertDataType(column.DataType.Type(), isDefaultNull, column.DataType.Unsigned())
|
||||
if err != nil {
|
||||
return Primary{}, nil, err
|
||||
}
|
||||
@@ -266,7 +266,8 @@ func (t *Table) ContainsTime() bool {
|
||||
// ConvertDataType converts mysql data type into golang data type
|
||||
func ConvertDataType(table *model.Table) (*Table, error) {
|
||||
isPrimaryDefaultNull := table.PrimaryKey.ColumnDefault == nil && table.PrimaryKey.IsNullAble == "YES"
|
||||
primaryDataType, err := converter.ConvertStringDataType(table.PrimaryKey.DataType, isPrimaryDefaultNull)
|
||||
isPrimaryUnsigned := strings.Contains(table.PrimaryKey.DbColumn.ColumnType, "unsigned")
|
||||
primaryDataType, err := converter.ConvertStringDataType(table.PrimaryKey.DataType, isPrimaryDefaultNull, isPrimaryUnsigned)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -345,7 +346,8 @@ func getTableFields(table *model.Table) (map[string]*Field, error) {
|
||||
fieldM := make(map[string]*Field)
|
||||
for _, each := range table.Columns {
|
||||
isDefaultNull := each.ColumnDefault == nil && each.IsNullAble == "YES"
|
||||
dt, err := converter.ConvertStringDataType(each.DataType, isDefaultNull)
|
||||
isPrimaryUnsigned := strings.Contains(each.ColumnType, "unsigned")
|
||||
dt, err := converter.ConvertStringDataType(each.DataType, isDefaultNull, isPrimaryUnsigned)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user