fix(writer): update nullable type handling to use baselib
* change default nullable type from resolvespec to baselib * update type mappings in tests to reflect new nullable types * adjust comments for clarity on nullable type options
This commit is contained in:
@@ -202,7 +202,7 @@ func formatComment(description, comment string) string {
|
||||
|
||||
func isStringLikePrimaryKeyType(goType string) bool {
|
||||
switch goType {
|
||||
case "string", "sql.NullString", "sql_types.SqlString", "sql_types.SqlUUID":
|
||||
case "string", "*string", "sql.NullString", "sql_types.SqlString", "sql_types.SqlUUID":
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
|
||||
@@ -20,7 +20,7 @@ type TypeMapper struct {
|
||||
// an empty string defaults to resolvespec.
|
||||
func NewTypeMapper(typeStyle string) *TypeMapper {
|
||||
if typeStyle == "" {
|
||||
typeStyle = writers.NullableTypeResolveSpec
|
||||
typeStyle = writers.NullableTypeBaselib
|
||||
}
|
||||
return &TypeMapper{
|
||||
sqlTypesAlias: "sql_types",
|
||||
@@ -37,11 +37,17 @@ func (tm *TypeMapper) SQLTypeToGoType(sqlType string, notNull bool) string {
|
||||
|
||||
baseType := tm.extractBaseType(sqlType)
|
||||
|
||||
if tm.typeStyle == writers.NullableTypeStdlib {
|
||||
switch tm.typeStyle {
|
||||
case writers.NullableTypeStdlib:
|
||||
if notNull {
|
||||
return tm.rawGoType(baseType)
|
||||
}
|
||||
return tm.stdlibNullableGoType(baseType)
|
||||
case writers.NullableTypeBaselib:
|
||||
if notNull {
|
||||
return tm.rawGoType(baseType)
|
||||
}
|
||||
return tm.baselibNullableGoType(baseType)
|
||||
}
|
||||
|
||||
// resolvespec (default)
|
||||
@@ -212,7 +218,7 @@ func (tm *TypeMapper) nullableGoType(sqlType string) string {
|
||||
// arrayGoType returns the Go type for a PostgreSQL array column.
|
||||
// The baseElemType is the canonical base type (e.g. "text", "integer").
|
||||
func (tm *TypeMapper) arrayGoType(baseElemType string) string {
|
||||
if tm.typeStyle == writers.NullableTypeStdlib {
|
||||
if tm.typeStyle == writers.NullableTypeStdlib || tm.typeStyle == writers.NullableTypeBaselib {
|
||||
return tm.stdlibArrayGoType(baseElemType)
|
||||
}
|
||||
typeMap := map[string]string{
|
||||
@@ -305,6 +311,38 @@ func (tm *TypeMapper) stdlibNullableGoType(sqlType string) string {
|
||||
return "sql.NullString"
|
||||
}
|
||||
|
||||
// baselibNullableGoType returns plain Go pointer types for nullable columns.
|
||||
func (tm *TypeMapper) baselibNullableGoType(sqlType string) string {
|
||||
typeMap := map[string]string{
|
||||
"integer": "*int32", "int": "*int32", "int4": "*int32", "serial": "*int32",
|
||||
"smallint": "*int16", "int2": "*int16", "smallserial": "*int16",
|
||||
"bigint": "*int64", "int8": "*int64", "bigserial": "*int64",
|
||||
"boolean": "*bool", "bool": "*bool",
|
||||
"real": "*float32", "float4": "*float32",
|
||||
"double precision": "*float64", "float8": "*float64",
|
||||
"numeric": "*float64", "decimal": "*float64", "money": "*float64",
|
||||
"text": "*string", "varchar": "*string", "char": "*string",
|
||||
"character": "*string", "citext": "*string", "bpchar": "*string",
|
||||
"inet": "*string", "cidr": "*string", "macaddr": "*string",
|
||||
"uuid": "*string", "json": "*string", "jsonb": "*string",
|
||||
"timestamp": "*time.Time",
|
||||
"timestamp without time zone": "*time.Time",
|
||||
"timestamp with time zone": "*time.Time",
|
||||
"timestamptz": "*time.Time",
|
||||
"date": "*time.Time",
|
||||
"time": "*time.Time",
|
||||
"time without time zone": "*time.Time",
|
||||
"time with time zone": "*time.Time",
|
||||
"timetz": "*time.Time",
|
||||
"bytea": "[]byte",
|
||||
"vector": "[]float32",
|
||||
}
|
||||
if goType, ok := typeMap[sqlType]; ok {
|
||||
return goType
|
||||
}
|
||||
return "*string"
|
||||
}
|
||||
|
||||
// stdlibArrayGoType returns a plain Go slice type for array columns in stdlib mode.
|
||||
func (tm *TypeMapper) stdlibArrayGoType(baseElemType string) string {
|
||||
typeMap := map[string]string{
|
||||
@@ -475,8 +513,11 @@ func (tm *TypeMapper) GetSQLTypesImport() string {
|
||||
// GetNullableTypeImportLine returns the full Go import line for the nullable type
|
||||
// package (ready to pass to AddImport). Returns empty string when no import is needed.
|
||||
func (tm *TypeMapper) GetNullableTypeImportLine() string {
|
||||
if tm.typeStyle == writers.NullableTypeStdlib {
|
||||
switch tm.typeStyle {
|
||||
case writers.NullableTypeStdlib:
|
||||
return "\"database/sql\""
|
||||
case writers.NullableTypeBaselib:
|
||||
return ""
|
||||
}
|
||||
return fmt.Sprintf("%s \"%s\"", tm.sqlTypesAlias, tm.GetSQLTypesImport())
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ func TestWriter_WriteTable(t *testing.T) {
|
||||
"ID",
|
||||
"int64",
|
||||
"Email",
|
||||
"sql_types.SqlString",
|
||||
"*string",
|
||||
"CreatedAt",
|
||||
"time.Time",
|
||||
"gorm:\"column:id",
|
||||
@@ -700,17 +700,17 @@ func TestTypeMapper_SQLTypeToGoType(t *testing.T) {
|
||||
want string
|
||||
}{
|
||||
{"bigint", true, "int64"},
|
||||
{"bigint", false, "sql_types.SqlInt64"},
|
||||
{"bigint", false, "*int64"},
|
||||
{"varchar", true, "string"},
|
||||
{"varchar", false, "sql_types.SqlString"},
|
||||
{"varchar", false, "*string"},
|
||||
{"timestamp", true, "time.Time"},
|
||||
{"timestamp", false, "sql_types.SqlTimeStamp"},
|
||||
{"timestamp", false, "*time.Time"},
|
||||
{"boolean", true, "bool"},
|
||||
{"boolean", false, "sql_types.SqlBool"},
|
||||
{"text[]", true, "sql_types.SqlStringArray"},
|
||||
{"text[]", false, "sql_types.SqlStringArray"},
|
||||
{"integer[]", true, "sql_types.SqlInt32Array"},
|
||||
{"bigint[]", false, "sql_types.SqlInt64Array"},
|
||||
{"boolean", false, "*bool"},
|
||||
{"text[]", true, "[]string"},
|
||||
{"text[]", false, "[]string"},
|
||||
{"integer[]", true, "[]int32"},
|
||||
{"bigint[]", false, "[]int64"},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
|
||||
Reference in New Issue
Block a user