Skip to content

Commit 1b0aa80

Browse files
committed
Fix AutoMigrate for bool fields with default value
1 parent e0c3be0 commit 1b0aa80

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

migrator/migrator.go

+13-6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"fmt"
88
"reflect"
99
"regexp"
10+
"strconv"
1011
"strings"
1112
"time"
1213

@@ -518,12 +519,18 @@ func (m Migrator) MigrateColumn(value interface{}, field *schema.Field, columnTy
518519
} else if !dvNotNull && currentDefaultNotNull {
519520
// null -> default value
520521
alterColumn = true
521-
} else if (field.GORMDataType != schema.Time && dv != field.DefaultValue) ||
522-
(field.GORMDataType == schema.Time && !strings.EqualFold(strings.TrimSuffix(dv, "()"), strings.TrimSuffix(field.DefaultValue, "()"))) {
523-
// default value not equal
524-
// not both null
525-
if currentDefaultNotNull || dvNotNull {
526-
alterColumn = true
522+
} else if currentDefaultNotNull || dvNotNull {
523+
switch field.GORMDataType {
524+
case schema.Time:
525+
if !strings.EqualFold(strings.TrimSuffix(dv, "()"), strings.TrimSuffix(field.DefaultValue, "()")) {
526+
alterColumn = true
527+
}
528+
case schema.Bool:
529+
v1, _ := strconv.ParseBool(dv)
530+
v2, _ := strconv.ParseBool(field.DefaultValue)
531+
alterColumn = v1 != v2
532+
default:
533+
alterColumn = dv != field.DefaultValue
527534
}
528535
}
529536
}

tests/migrate_test.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"math/rand"
88
"os"
99
"reflect"
10+
"strconv"
1011
"strings"
1112
"testing"
1213
"time"
@@ -1420,7 +1421,7 @@ func TestMigrateSameEmbeddedFieldName(t *testing.T) {
14201421
AssertEqual(t, nil, err)
14211422
}
14221423

1423-
func TestMigrateDefaultNullString(t *testing.T) {
1424+
func TestMigrateWithDefaultValue(t *testing.T) {
14241425
if DB.Dialector.Name() == "sqlserver" {
14251426
// sqlserver driver treats NULL and 'NULL' the same
14261427
t.Skip("skip sqlserver")
@@ -1434,6 +1435,7 @@ func TestMigrateDefaultNullString(t *testing.T) {
14341435
type NullStringModel struct {
14351436
ID uint
14361437
Content string `gorm:"default:'null'"`
1438+
Active bool `gorm:"default:false"`
14371439
}
14381440

14391441
tableName := "null_string_model"
@@ -1454,6 +1456,14 @@ func TestMigrateDefaultNullString(t *testing.T) {
14541456
AssertEqual(t, defVal, "null")
14551457
AssertEqual(t, ok, true)
14561458

1459+
columnType2, err := findColumnType(tableName, "active")
1460+
AssertEqual(t, err, nil)
1461+
1462+
defVal, ok = columnType2.DefaultValue()
1463+
bv, _ := strconv.ParseBool(defVal)
1464+
AssertEqual(t, bv, false)
1465+
AssertEqual(t, ok, true)
1466+
14571467
// default 'null' -> 'null'
14581468
session := DB.Session(&gorm.Session{Logger: Tracer{
14591469
Logger: DB.Config.Logger,

0 commit comments

Comments
 (0)