Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix AutoMigrate, alterColumn The previous modifications were ignored #7369

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

general252
Copy link

	// check default value
	if !field.PrimaryKey {
		currentDefaultNotNull := field.HasDefaultValue && (field.DefaultValueInterface != nil || !strings.EqualFold(field.DefaultValue, "NULL"))
		dv, dvNotNull := columnType.DefaultValue()
		if dvNotNull && !currentDefaultNotNull {
			// default value -> null
			alterColumn = true
		} else if !dvNotNull && currentDefaultNotNull {
			// null -> default value
			alterColumn = true
		} else if currentDefaultNotNull || dvNotNull {
			switch field.GORMDataType {
			case schema.Time:
				if !strings.EqualFold(strings.TrimSuffix(dv, "()"), strings.TrimSuffix(field.DefaultValue, "()")) {
					alterColumn = true
				}
			case schema.Bool:
				v1, _ := strconv.ParseBool(dv)
				v2, _ := strconv.ParseBool(field.DefaultValue)
				alterColumn = v1 != v2                                          // ---- 如果alterColumn旧值为true, 应不作修改
			default:
				alterColumn = dv != field.DefaultValue                 // ---- 如果alterColumn旧值为true, 应不作修改
			}
		}
	}

@jinzhu
Copy link
Member

jinzhu commented Feb 13, 2025

Hi @general252

Can you ad some tests?

@general252
Copy link
Author

package main

import (
	"fmt"
	"log"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type WarnMessage struct {
	ID   uint
	Type *string `gorm:"column:type;default:'';size:16"` // update size 16 -> 64
}

func main() {
	var (
		user     = "root"
		password = "123456"
		host     = "127.0.0.1"
		port     = "3306"
		dbname   = "test"
	)

	dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?parseTime=true", user, password, host, port, dbname)
	e, err := gorm.Open(mysql.New(mysql.Config{
		DriverName: mysql.DefaultDriverName,
		DSN:        dsn,
	}))
	if err != nil {
		return
	}

	err = e.AutoMigrate(new(WarnMessage))
	log.Println(err)
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants