From e9f4df09aebc32695cee3f8eb9a6248581f6a18b Mon Sep 17 00:00:00 2001 From: zhangyawen <240440387@qq.com> Date: Thu, 18 Sep 2025 17:46:23 +0800 Subject: [PATCH] feat:show bug [If a field in a database table uses the serializer tag and AutoMigrate is used, then even if there are no changes to this field, AutoMigrate will still perform an ALTER on the table every time.] --- db.go | 37 +++++-------------------------------- go.mod | 4 ++-- main_test.go | 40 ++++++++++++++++++---------------------- 3 files changed, 25 insertions(+), 56 deletions(-) diff --git a/db.go b/db.go index 4bef430..e805504 100644 --- a/db.go +++ b/db.go @@ -1,16 +1,12 @@ package main import ( + "gorm.io/driver/mysql" "log" "math/rand" "os" - "path/filepath" "time" - "gorm.io/driver/mysql" - "gorm.io/driver/postgres" - "gorm.io/driver/sqlite" - "gorm.io/driver/sqlserver" "gorm.io/gorm" "gorm.io/gorm/logger" . "gorm.io/playground/models" @@ -44,34 +40,11 @@ func init() { func OpenTestConnection() (db *gorm.DB, err error) { dbDSN := os.Getenv("GORM_DSN") - switch os.Getenv("GORM_DIALECT") { - case "mysql": - log.Println("testing mysql...") - if dbDSN == "" { - dbDSN = "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local" - } - db, err = gorm.Open(mysql.Open(dbDSN), &gorm.Config{}) - case "postgres": - log.Println("testing postgres...") - if dbDSN == "" { - dbDSN = "user=gorm password=gorm host=localhost dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai" - } - db, err = gorm.Open(postgres.Open(dbDSN), &gorm.Config{}) - case "sqlserver": - // CREATE LOGIN gorm WITH PASSWORD = 'LoremIpsum86'; - // CREATE DATABASE gorm; - // USE gorm; - // CREATE USER gorm FROM LOGIN gorm; - // sp_changedbowner 'gorm'; - log.Println("testing sqlserver...") - if dbDSN == "" { - dbDSN = "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm" - } - db, err = gorm.Open(sqlserver.Open(dbDSN), &gorm.Config{}) - default: - log.Println("testing sqlite3...") - db, err = gorm.Open(sqlite.Open(filepath.Join(os.TempDir(), "gorm.db")), &gorm.Config{}) + log.Println("testing mysql...") + if dbDSN == "" { + dbDSN = "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local" } + db, err = gorm.Open(mysql.Open(dbDSN), &gorm.Config{}) if debug := os.Getenv("DEBUG"); debug == "true" { db.Logger = db.Logger.LogMode(logger.Info) diff --git a/go.mod b/go.mod index 1348430..0351424 100644 --- a/go.mod +++ b/go.mod @@ -29,8 +29,8 @@ require ( golang.org/x/crypto v0.41.0 // indirect golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b // indirect golang.org/x/mod v0.27.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/text v0.28.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/text v0.29.0 // indirect golang.org/x/tools v0.36.0 // indirect gorm.io/cmd/gorm v0.1.1-0.20250825094947-30e7d4fa1f1f // indirect gorm.io/datatypes v1.2.5 // indirect diff --git a/main_test.go b/main_test.go index 12ffdfe..b1dde2d 100644 --- a/main_test.go +++ b/main_test.go @@ -2,34 +2,30 @@ package main import ( "testing" - - "gorm.io/playground/models" ) // GORM_REPO: https://github.com/go-gorm/gorm.git // GORM_BRANCH: master -// TEST_DRIVERS: sqlite, mysql, postgres, sqlserver +// TEST_DRIVERS: mysql func TestGORM(t *testing.T) { - user := models.User{Name: "jinzhu"} - - DB.Create(&user) - - var result models.User - if err := DB.First(&result, user.ID).Error; err != nil { - t.Errorf("Failed, got error: %v", err) + type GormBugTest struct { + IDS []string `gorm:"serializer:json;column:ids;type:varchar(1000);not null;default:'名称';comment:ids" json:"ids"` } -} -// func TestGORMGen(t *testing.T) { -// user := models.User{Name: "jinzhu2"} -// ctx := context.Background() - -// gorm.G[models.User](DB).Create(ctx, &user) + for i := 0; i < 3; i++ { + // If a field in a database table uses the serializer tag and AutoMigrate is used, + // then even if there are no changes to this field + // ,AutoMigrate will still perform an ALTER on the table every time. + + // This will alter the ids field of the GormBugTest table four times, + // even though the field hasn't changed at all. + err := DB.AutoMigrate(GormBugTest{}) + if err != nil { + t.Errorf("Failed, got error: %v", err) + } + } -// if u, err := gorm.G[models.User](DB).Where(g.User.ID.Eq(user.ID)).First(ctx); err != nil { -// t.Errorf("Failed, got error: %v", err) -// } else if u.Name != user.Name { -// t.Errorf("Failed, got user name: %v", u.Name) -// } -// } + t.Log("This will alter the ids field of the GormBugTest table four times,even though the field hasn't changed at all.") + t.Log("这里会alter四次GormBugTest表的ids字段 虽然字段没有任何变化") +}