feat: add --types flag and stdlib nullable type support for bun/gorm writers
* Fix pgsql reader double-quoting defaults: normalizePostgresDefault strips surrounding SQL string literal quotes from column_default before storing, matching the convention used by every other reader. * Add NullableTypes field to WriterOptions with NullableTypeResolveSpec (default) and NullableTypeStdlib constants. * Both bun and gorm TypeMappers now accept a typeStyle parameter. stdlib mode produces sql.NullString/NullInt32/NullTime etc. for nullable scalars, plain Go slices for arrays, and time.Time for NOT NULL timestamps. Default resolvespec behaviour is unchanged. * Add --types flag to convert and split commands. * Update bun/README.md and gorm/README.md with side-by-side generated code examples, updated type mapping tables, and Writer Options documentation.
This commit is contained in:
@@ -252,7 +252,7 @@ func (r *Reader) queryColumns(schemaName string) (map[string]map[string]*models.
|
||||
column.AutoIncrement = true
|
||||
column.Default = defaultVal
|
||||
} else {
|
||||
column.Default = defaultVal
|
||||
column.Default = normalizePostgresDefault(defaultVal)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -613,3 +613,30 @@ func (r *Reader) parseIndexDefinition(indexName, tableName, schema, indexDef str
|
||||
|
||||
return index, nil
|
||||
}
|
||||
|
||||
// normalizePostgresDefault converts a raw PostgreSQL column_default expression into the
|
||||
// unquoted string value that the model convention expects. PostgreSQL stores string
|
||||
// literal defaults as 'value' or 'value'::type (e.g. '{}'::text[]), while every other
|
||||
// reader stores the bare value so the writer can re-quote it correctly.
|
||||
func normalizePostgresDefault(defaultVal string) string {
|
||||
if !strings.HasPrefix(defaultVal, "'") {
|
||||
return defaultVal
|
||||
}
|
||||
// Decode the SQL string literal: skip the leading quote, unescape '' → ', stop at
|
||||
// the first unescaped closing quote (any trailing ::cast is ignored).
|
||||
rest := defaultVal[1:]
|
||||
var buf strings.Builder
|
||||
for i := 0; i < len(rest); i++ {
|
||||
if rest[i] == '\'' {
|
||||
if i+1 < len(rest) && rest[i+1] == '\'' {
|
||||
buf.WriteByte('\'')
|
||||
i++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
} else {
|
||||
buf.WriteByte(rest[i])
|
||||
}
|
||||
}
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user