Fix bug when json with a real SQLType in the tag

This commit is contained in:
Lunny Xiao 2025-07-17 14:25:55 -07:00
parent f50aacd38b
commit 3624e09e56
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
3 changed files with 57 additions and 7 deletions

View File

@ -250,12 +250,16 @@ func (parser *Parser) parseFieldWithTags(table *schemas.Table, fieldIndex int, f
} }
if col.SQLType.Name == "" { if col.SQLType.Name == "" {
if col.IsJSON {
col.SQLType = schemas.SQLType{Name: schemas.Text}
} else {
var err error var err error
col.SQLType, err = parser.getSQLTypeByType(field.Type) col.SQLType, err = parser.getSQLTypeByType(field.Type)
if err != nil { if err != nil {
return nil, err return nil, err
} }
} }
}
if ctx.isUnsigned && col.SQLType.IsNumeric() && !strings.HasPrefix(col.SQLType.Name, "UNSIGNED") { if ctx.isUnsigned && col.SQLType.IsNumeric() && !strings.HasPrefix(col.SQLType.Name, "UNSIGNED") {
col.SQLType.Name = "UNSIGNED " + col.SQLType.Name col.SQLType.Name = "UNSIGNED " + col.SQLType.Name
} }

View File

@ -617,3 +617,41 @@ func TestParseWithSQLType(t *testing.T) {
assert.EqualValues(t, "DATETIME", table.Columns()[3].SQLType.Name) assert.EqualValues(t, "DATETIME", table.Columns()[3].SQLType.Name)
assert.EqualValues(t, "UUID", table.Columns()[4].SQLType.Name) assert.EqualValues(t, "UUID", table.Columns()[4].SQLType.Name)
} }
func TestParseWithJSONLongText(t *testing.T) {
parser := NewParser(
"db",
dialects.QueryDialect("mysql"),
names.GonicMapper{
"JSON": true,
},
names.GonicMapper{
"JSON": true,
},
caches.NewManager(),
)
type StructWithJSONLongText struct {
Col1 string `db:"LongText json"`
}
table, err := parser.Parse(reflect.ValueOf(new(StructWithJSONLongText)))
assert.NoError(t, err)
assert.EqualValues(t, "struct_with_json_long_text", table.Name)
assert.EqualValues(t, 1, len(table.Columns()))
assert.EqualValues(t, "col1", table.Columns()[0].Name)
assert.EqualValues(t, "LONGTEXT", table.Columns()[0].SQLType.Name)
assert.EqualValues(t, true, table.Columns()[0].IsJSON)
type StructWithJSONLongText2 struct {
Col1 string `db:"json"`
}
table, err = parser.Parse(reflect.ValueOf(new(StructWithJSONLongText2)))
assert.NoError(t, err)
assert.EqualValues(t, "struct_with_json_long_text2", table.Name)
assert.EqualValues(t, 1, len(table.Columns()))
assert.EqualValues(t, "col1", table.Columns()[0].Name)
assert.EqualValues(t, "TEXT", table.Columns()[0].SQLType.Name)
assert.EqualValues(t, true, table.Columns()[0].IsJSON)
}

View File

@ -124,10 +124,16 @@ var defaultTagHandlers = map[string]Handler{
"EXTENDS": ExtendsTagHandler, "EXTENDS": ExtendsTagHandler,
"UNSIGNED": UnsignedTagHandler, "UNSIGNED": UnsignedTagHandler,
"COLLATE": CollateTagHandler, "COLLATE": CollateTagHandler,
"JSON": JSONTagHandler,
"JSONB": JSONTagHandler,
} }
func init() { func init() {
for k := range schemas.SqlTypes { for k := range schemas.SqlTypes {
// don't override default tag handlers
if _, ok := defaultTagHandlers[k]; ok {
continue
}
defaultTagHandlers[k] = SQLTypeTagHandler defaultTagHandlers[k] = SQLTypeTagHandler
} }
} }
@ -293,12 +299,14 @@ func CollateTagHandler(ctx *Context) error {
return nil return nil
} }
func JSONTagHandler(ctx *Context) error {
ctx.col.IsJSON = true
return nil
}
// SQLTypeTagHandler describes SQL Type tag handler // SQLTypeTagHandler describes SQL Type tag handler
func SQLTypeTagHandler(ctx *Context) error { func SQLTypeTagHandler(ctx *Context) error {
ctx.col.SQLType = schemas.SQLType{Name: ctx.tagUname} ctx.col.SQLType = schemas.SQLType{Name: ctx.tagUname}
if ctx.tagUname == "JSON" || ctx.tagUname == "JSONB" {
ctx.col.IsJSON = true
}
if len(ctx.params) == 0 { if len(ctx.params) == 0 {
return nil return nil
} }