fix(pgsql): strip backticks from column defaults in migration paths
Backtick-wrapped defaults (e.g. from GORM tags like `now()`) were only stripped in the CREATE TABLE column-definition path, leaving raw backticks in the ALTER COLUMN ... SET DEFAULT migration statement and in the migration-generated CREATE TABLE template, producing invalid SQL. Default-drift comparisons also compared raw values, so a backtick-wrapped model default never matched the live DB default and kept re-emitting redundant ALTER statements.
This commit is contained in:
@@ -460,7 +460,7 @@ func (w *MigrationWriter) generateAlterTableScripts(schema *models.Schema, model
|
||||
}
|
||||
|
||||
// Check default value changes
|
||||
if fmt.Sprintf("%v", modelCol.Default) != fmt.Sprintf("%v", currentCol.Default) {
|
||||
if !columnDefaultsEqual(modelCol.Default, currentCol.Default) {
|
||||
setDefault, defaultVal := formatColumnDefaultSQL(modelCol)
|
||||
|
||||
sql, err := w.executor.ExecuteAlterColumnDefaultWithCheck(AlterColumnDefaultWithCheckData{
|
||||
@@ -956,7 +956,24 @@ func columnsEqual(col1, col2 *models.Column) bool {
|
||||
}
|
||||
return columnTypesEqual(col1, col2) &&
|
||||
col1.NotNull == col2.NotNull &&
|
||||
fmt.Sprintf("%v", col1.Default) == fmt.Sprintf("%v", col2.Default)
|
||||
columnDefaultsEqual(col1.Default, col2.Default)
|
||||
}
|
||||
|
||||
// columnDefaultsEqual compares column defaults for drift detection, stripping
|
||||
// MySQL-style backticks (e.g. from GORM tags) so a model default of
|
||||
// "`now()`" is recognised as equal to a live default of "now()".
|
||||
func columnDefaultsEqual(default1, default2 interface{}) bool {
|
||||
return normalizeDefaultForCompare(default1) == normalizeDefaultForCompare(default2)
|
||||
}
|
||||
|
||||
func normalizeDefaultForCompare(value interface{}) string {
|
||||
if value == nil {
|
||||
return ""
|
||||
}
|
||||
if s, ok := value.(string); ok {
|
||||
return strings.TrimSpace(stripBackticks(s))
|
||||
}
|
||||
return fmt.Sprintf("%v", value)
|
||||
}
|
||||
|
||||
func columnTypesEqual(col1, col2 *models.Column) bool {
|
||||
|
||||
Reference in New Issue
Block a user