Merge pull request #4 from usernameisnull/change-driver-name
change driver name and remove some duplicated tests
This commit is contained in:
		
						commit
						b32dab0f2d
					
				
							
								
								
									
										248
									
								
								tests/gaussdb_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										248
									
								
								tests/gaussdb_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,248 @@ | ||||
| package tests_test | ||||
| 
 | ||||
| import ( | ||||
| 	"testing" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/google/uuid" | ||||
| 	"github.com/lib/pq" | ||||
| 	"gorm.io/gorm" | ||||
| 	"gorm.io/gorm/clause" | ||||
| 	. "gorm.io/gorm/utils/tests" | ||||
| ) | ||||
| 
 | ||||
| func TestGaussDBReturningIDWhichHasStringType(t *testing.T) { | ||||
| 	t.Skipf("This test case skipped, because of gaussdb not support pgcrypto extension and gen_random_uuid() function") | ||||
| 	if DB.Dialector.Name() != "gaussdb" { | ||||
| 		t.Skip() | ||||
| 	} | ||||
| 
 | ||||
| 	type Yasuo struct { | ||||
| 		// TODO: function gen_random_uuid() does not exist
 | ||||
| 		ID        string `gorm:"default:gen_random_uuid()"` | ||||
| 		Name      string | ||||
| 		CreatedAt time.Time `gorm:"type:TIMESTAMP WITHOUT TIME ZONE"` | ||||
| 		UpdatedAt time.Time `gorm:"type:TIMESTAMP WITHOUT TIME ZONE;default:current_timestamp"` | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.Exec("CREATE EXTENSION IF NOT EXISTS pgcrypto;").Error; err != nil { | ||||
| 		t.Errorf("Failed to create extension pgcrypto, got error %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	DB.Migrator().DropTable(&Yasuo{}) | ||||
| 
 | ||||
| 	if err := DB.AutoMigrate(&Yasuo{}); err != nil { | ||||
| 		t.Fatalf("Failed to migrate for uuid default value, got error: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	yasuo := Yasuo{Name: "jinzhu"} | ||||
| 	if err := DB.Create(&yasuo).Error; err != nil { | ||||
| 		t.Fatalf("should be able to create data, but got %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if yasuo.ID == "" { | ||||
| 		t.Fatal("should be able to has ID, but got zero value") | ||||
| 	} | ||||
| 
 | ||||
| 	var result Yasuo | ||||
| 	if err := DB.First(&result, "id = ?", yasuo.ID).Error; err != nil || yasuo.Name != "jinzhu" { | ||||
| 		t.Errorf("No error should happen, but got %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.Where("id = $1", yasuo.ID).First(&Yasuo{}).Error; err != nil || yasuo.Name != "jinzhu" { | ||||
| 		t.Errorf("No error should happen, but got %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	yasuo.Name = "jinzhu1" | ||||
| 	if err := DB.Save(&yasuo).Error; err != nil { | ||||
| 		t.Errorf("Failed to update date, got error %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.First(&result, "id = ?", yasuo.ID).Error; err != nil || yasuo.Name != "jinzhu1" { | ||||
| 		t.Errorf("No error should happen, but got %v", err) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestGaussDB(t *testing.T) { | ||||
| 	t.Skipf("This test case skipped, because of gaussdb not support pgcrypto extension and gen_random_uuid() function") | ||||
| 	if DB.Dialector.Name() != "gaussdb" { | ||||
| 		t.Skip() | ||||
| 	} | ||||
| 
 | ||||
| 	type Harumph struct { | ||||
| 		gorm.Model | ||||
| 		Name string `gorm:"check:name_checker,name <> ''"` | ||||
| 		// TODO: function gen_random_uuid() does not exist
 | ||||
| 		Test      uuid.UUID      `gorm:"type:uuid;not null;default:gen_random_uuid()"` | ||||
| 		CreatedAt time.Time      `gorm:"type:TIMESTAMP WITHOUT TIME ZONE"` | ||||
| 		UpdatedAt time.Time      `gorm:"type:TIMESTAMP WITHOUT TIME ZONE;default:current_timestamp"` | ||||
| 		Things    pq.StringArray `gorm:"type:text[]"` | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.Exec("CREATE EXTENSION IF NOT EXISTS pgcrypto;").Error; err != nil { | ||||
| 		t.Errorf("Failed to create extension pgcrypto, got error %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	DB.Migrator().DropTable(&Harumph{}) | ||||
| 
 | ||||
| 	if err := DB.AutoMigrate(&Harumph{}); err != nil { | ||||
| 		t.Fatalf("Failed to migrate for uuid default value, got error: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	harumph := Harumph{} | ||||
| 	if err := DB.Create(&harumph).Error; err == nil { | ||||
| 		t.Fatalf("should failed to create data, name can't be blank") | ||||
| 	} | ||||
| 
 | ||||
| 	harumph = Harumph{Name: "jinzhu"} | ||||
| 	if err := DB.Create(&harumph).Error; err != nil { | ||||
| 		t.Fatalf("should be able to create data, but got %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	var result Harumph | ||||
| 	if err := DB.First(&result, "id = ?", harumph.ID).Error; err != nil || harumph.Name != "jinzhu" { | ||||
| 		t.Errorf("No error should happen, but got %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.Where("id = $1", harumph.ID).First(&Harumph{}).Error; err != nil || harumph.Name != "jinzhu" { | ||||
| 		t.Errorf("No error should happen, but got %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	harumph.Name = "jinzhu1" | ||||
| 	if err := DB.Save(&harumph).Error; err != nil { | ||||
| 		t.Errorf("Failed to update date, got error %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.First(&result, "id = ?", harumph.ID).Error; err != nil || harumph.Name != "jinzhu1" { | ||||
| 		t.Errorf("No error should happen, but got %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	DB.Migrator().DropTable("log_usage") | ||||
| 
 | ||||
| 	if err := DB.Exec(` | ||||
| CREATE TABLE public.log_usage ( | ||||
|     log_id bigint NOT NULL | ||||
| ); | ||||
| 
 | ||||
| ALTER TABLE public.log_usage ALTER COLUMN log_id ADD GENERATED BY DEFAULT AS IDENTITY ( | ||||
|     SEQUENCE NAME public.log_usage_log_id_seq | ||||
|     START WITH 1 | ||||
|     INCREMENT BY 1 | ||||
|     NO MINVALUE | ||||
|     NO MAXVALUE | ||||
|     CACHE 1 | ||||
| ); | ||||
| 	`).Error; err != nil { | ||||
| 		t.Fatalf("failed to create table, got error %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	columns, err := DB.Migrator().ColumnTypes("log_usage") | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to get columns, got error %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	hasLogID := false | ||||
| 	for _, column := range columns { | ||||
| 		if column.Name() == "log_id" { | ||||
| 			hasLogID = true | ||||
| 			autoIncrement, ok := column.AutoIncrement() | ||||
| 			if !ok || !autoIncrement { | ||||
| 				t.Fatalf("column log_id should be auto incrementment") | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if !hasLogID { | ||||
| 		t.Fatalf("failed to found column log_id") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestGaussDBMany2ManyWithDefaultValueUUID(t *testing.T) { | ||||
| 	t.Skipf("This test case skipped, because of gaussdb does not have 'uuid-ossp' extension") | ||||
| 	if DB.Dialector.Name() != "gaussdb" { | ||||
| 		t.Skip() | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.Exec(`create extension if not exists "uuid-ossp"`).Error; err != nil { | ||||
| 		t.Fatalf("Failed to create 'uuid-ossp' extension, but got error %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	DB.Migrator().DropTable(&Post{}, &Category{}, "post_categories") | ||||
| 	DB.AutoMigrate(&Post{}, &Category{}) | ||||
| 
 | ||||
| 	post := Post{ | ||||
| 		Title: "Hello World", | ||||
| 		Categories: []*Category{ | ||||
| 			{Title: "Coding"}, | ||||
| 			{Title: "Golang"}, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.Create(&post).Error; err != nil { | ||||
| 		t.Errorf("Failed, got error: %v", err) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestGaussDBOnConstraint(t *testing.T) { | ||||
| 	t.Skipf("This test case skipped, because of gaussdb not support 'ON CONSTRAINT' statement") | ||||
| 	if DB.Dialector.Name() != "gaussdb" { | ||||
| 		t.Skip() | ||||
| 	} | ||||
| 
 | ||||
| 	type Thing struct { | ||||
| 		gorm.Model | ||||
| 		SomeID  string | ||||
| 		OtherID string | ||||
| 		Data    string | ||||
| 	} | ||||
| 
 | ||||
| 	DB.Migrator().DropTable(&Thing{}) | ||||
| 	DB.Migrator().CreateTable(&Thing{}) | ||||
| 	if err := DB.Exec("ALTER TABLE things ADD CONSTRAINT some_id_other_id_unique UNIQUE (some_id, other_id)").Error; err != nil { | ||||
| 		t.Error(err) | ||||
| 	} | ||||
| 
 | ||||
| 	thing := Thing{ | ||||
| 		SomeID:  "1234", | ||||
| 		OtherID: "1234", | ||||
| 		Data:    "something", | ||||
| 	} | ||||
| 
 | ||||
| 	DB.Create(&thing) | ||||
| 
 | ||||
| 	thing2 := Thing{ | ||||
| 		SomeID:  "1234", | ||||
| 		OtherID: "1234", | ||||
| 		Data:    "something else", | ||||
| 	} | ||||
| 
 | ||||
| 	result := DB.Clauses(clause.OnConflict{ | ||||
| 		OnConstraint: "some_id_other_id_unique", | ||||
| 		UpdateAll:    true, | ||||
| 	}).Create(&thing2) | ||||
| 	if result.Error != nil { | ||||
| 		t.Errorf("creating second thing: %v", result.Error) | ||||
| 	} | ||||
| 
 | ||||
| 	var things []Thing | ||||
| 	if err := DB.Find(&things).Error; err != nil { | ||||
| 		t.Errorf("Failed, got error: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if len(things) > 1 { | ||||
| 		t.Errorf("expected 1 thing got more") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestGaussDBAlterColumnDataType(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "gaussdb" { | ||||
| 		t.Skip() | ||||
| 	} | ||||
| 	DB.Migrator().DropTable(&Company{}) | ||||
| 	DB.AutoMigrate(Company{}) | ||||
| 	if err := DB.Table("companies").Migrator().AlterColumn(CompanyNew{}, "name"); err != nil { | ||||
| 		t.Fatalf("failed to alter column from string to int, got error %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	DB.AutoMigrate(Company{}) | ||||
| } | ||||
| @ -7,6 +7,7 @@ require ( | ||||
| 	github.com/jinzhu/now v1.1.5 | ||||
| 	github.com/lib/pq v1.10.9 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	gorm.io/driver/gaussdb v0.1.0 | ||||
| 	gorm.io/driver/mysql v1.6.0 | ||||
| 	gorm.io/driver/postgres v1.6.0 | ||||
| 	gorm.io/driver/sqlite v1.6.0 | ||||
| @ -16,6 +17,7 @@ require ( | ||||
| 
 | ||||
| require ( | ||||
| 	filippo.io/edwards25519 v1.1.0 // indirect | ||||
| 	github.com/HuaweiCloudDeveloper/gaussdb-go v1.0.0-rc1 // indirect | ||||
| 	github.com/davecgh/go-spew v1.1.1 // indirect | ||||
| 	github.com/go-sql-driver/mysql v1.9.2 // indirect | ||||
| 	github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect | ||||
| @ -30,10 +32,11 @@ require ( | ||||
| 	github.com/microsoft/go-mssqldb v1.8.2 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.0 // indirect | ||||
| 	github.com/rogpeppe/go-internal v1.12.0 // indirect | ||||
| 	github.com/tjfoc/gmsm v1.4.1 // indirect | ||||
| 	golang.org/x/crypto v0.38.0 // indirect | ||||
| 	golang.org/x/sync v0.14.0 // indirect | ||||
| 	golang.org/x/text v0.25.0 // indirect | ||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||
| ) | ||||
| 
 | ||||
| replace gorm.io/gorm => ../ | ||||
| replace gorm.io/gorm => ../ | ||||
| @ -11,8 +11,8 @@ import ( | ||||
| 	"testing" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/moseszane168/gaussdb" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"gorm.io/driver/gaussdb" | ||||
| 	"gorm.io/driver/postgres" | ||||
| 
 | ||||
| 	"gorm.io/gorm" | ||||
| @ -83,46 +83,8 @@ func TestMigrate(t *testing.T) { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestAutoMigrateInt8PG(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	type Smallint int8 | ||||
| 
 | ||||
| 	type MigrateInt struct { | ||||
| 		Int8 Smallint | ||||
| 	} | ||||
| 
 | ||||
| 	tracer := Tracer{ | ||||
| 		Logger: DB.Config.Logger, | ||||
| 		Test: func(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { | ||||
| 			sql, _ := fc() | ||||
| 			if strings.HasPrefix(sql, "ALTER TABLE \"migrate_ints\" ALTER COLUMN \"int8\" TYPE smallint") { | ||||
| 				t.Fatalf("shouldn't execute ALTER COLUMN TYPE if such type is already existed in DB schema: sql: %s", | ||||
| 					sql) | ||||
| 			} | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	DB.Migrator().DropTable(&MigrateInt{}) | ||||
| 
 | ||||
| 	// The first AutoMigrate to make table with field with correct type
 | ||||
| 	if err := DB.AutoMigrate(&MigrateInt{}); err != nil { | ||||
| 		t.Fatalf("Failed to auto migrate: error: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	// make new session to set custom logger tracer
 | ||||
| 	session := DB.Session(&gorm.Session{Logger: tracer}) | ||||
| 
 | ||||
| 	// The second AutoMigrate to catch an error
 | ||||
| 	if err := session.AutoMigrate(&MigrateInt{}); err != nil { | ||||
| 		t.Fatalf("Failed to auto migrate: error: %v", err) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestAutoMigrateGaussDB(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "gaussdb" { | ||||
| func TestAutoMigrateInt8PGAndGaussDB(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "postgres" && DB.Dialector.Name() != "gaussdb" { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| @ -976,68 +938,7 @@ func TestMigrateColumnOrder(t *testing.T) { | ||||
| 
 | ||||
| // https://github.com/go-gorm/gorm/issues/5047
 | ||||
| func TestMigrateSerialColumn(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	type Event struct { | ||||
| 		ID  uint `gorm:"primarykey"` | ||||
| 		UID uint32 | ||||
| 	} | ||||
| 
 | ||||
| 	type Event1 struct { | ||||
| 		ID  uint   `gorm:"primarykey"` | ||||
| 		UID uint32 `gorm:"not null;autoIncrement"` | ||||
| 	} | ||||
| 
 | ||||
| 	type Event2 struct { | ||||
| 		ID  uint   `gorm:"primarykey"` | ||||
| 		UID uint16 `gorm:"not null;autoIncrement"` | ||||
| 	} | ||||
| 
 | ||||
| 	var err error | ||||
| 	err = DB.Migrator().DropTable(&Event{}) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("DropTable err:%v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	// create sequence
 | ||||
| 	err = DB.Table("events").AutoMigrate(&Event1{}) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("AutoMigrate err:%v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	// delete sequence
 | ||||
| 	err = DB.Table("events").AutoMigrate(&Event{}) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("AutoMigrate err:%v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	// update sequence
 | ||||
| 	err = DB.Table("events").AutoMigrate(&Event1{}) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("AutoMigrate err:%v", err) | ||||
| 	} | ||||
| 	err = DB.Table("events").AutoMigrate(&Event2{}) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("AutoMigrate err:%v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	DB.Table("events").Save(&Event2{}) | ||||
| 	DB.Table("events").Save(&Event2{}) | ||||
| 	DB.Table("events").Save(&Event2{}) | ||||
| 
 | ||||
| 	events := make([]*Event, 0) | ||||
| 	DB.Table("events").Find(&events) | ||||
| 
 | ||||
| 	AssertEqual(t, 3, len(events)) | ||||
| 	for _, v := range events { | ||||
| 		AssertEqual(t, v.ID, v.UID) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestMigrateSerialColumnGaussDB(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "gaussdb" { | ||||
| 	if DB.Dialector.Name() != "postgres" && DB.Dialector.Name() != "gaussdb" { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| @ -1162,7 +1063,7 @@ func TestMigrateAutoIncrement(t *testing.T) { | ||||
| 
 | ||||
| // https://github.com/go-gorm/gorm/issues/5320
 | ||||
| func TestPrimarykeyID(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" { | ||||
| 	if DB.Dialector.Name() != "postgres" { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| @ -1398,7 +1299,7 @@ func findColumnType(dest interface{}, columnName string) ( | ||||
| } | ||||
| 
 | ||||
| func TestInvalidCachedPlanSimpleProtocol(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" { | ||||
| 	if DB.Dialector.Name() != "postgres" { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| @ -1509,43 +1410,7 @@ func TestDifferentTypeWithoutDeclaredLength(t *testing.T) { | ||||
| } | ||||
| 
 | ||||
| func TestMigrateArrayTypeModel(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	type ArrayTypeModel struct { | ||||
| 		ID              uint | ||||
| 		Number          string     `gorm:"type:varchar(51);NOT NULL"` | ||||
| 		TextArray       []string   `gorm:"type:text[];NOT NULL"` | ||||
| 		NestedTextArray [][]string `gorm:"type:text[][]"` | ||||
| 		NestedIntArray  [][]int64  `gorm:"type:integer[3][3]"` | ||||
| 	} | ||||
| 
 | ||||
| 	var err error | ||||
| 	DB.Migrator().DropTable(&ArrayTypeModel{}) | ||||
| 
 | ||||
| 	err = DB.AutoMigrate(&ArrayTypeModel{}) | ||||
| 	AssertEqual(t, nil, err) | ||||
| 
 | ||||
| 	ct, err := findColumnType(&ArrayTypeModel{}, "number") | ||||
| 	AssertEqual(t, nil, err) | ||||
| 	AssertEqual(t, "varchar", ct.DatabaseTypeName()) | ||||
| 
 | ||||
| 	ct, err = findColumnType(&ArrayTypeModel{}, "text_array") | ||||
| 	AssertEqual(t, nil, err) | ||||
| 	AssertEqual(t, "text[]", ct.DatabaseTypeName()) | ||||
| 
 | ||||
| 	ct, err = findColumnType(&ArrayTypeModel{}, "nested_text_array") | ||||
| 	AssertEqual(t, nil, err) | ||||
| 	AssertEqual(t, "text[]", ct.DatabaseTypeName()) | ||||
| 
 | ||||
| 	ct, err = findColumnType(&ArrayTypeModel{}, "nested_int_array") | ||||
| 	AssertEqual(t, nil, err) | ||||
| 	AssertEqual(t, "integer[]", ct.DatabaseTypeName()) | ||||
| } | ||||
| 
 | ||||
| func TestMigrateArrayTypeModelGaussDB(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "gaussdb" { | ||||
| 	if DB.Dialector.Name() != "postgres" && DB.Dialector.Name() != "gaussdb" { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| @ -1867,67 +1732,8 @@ func TestMigrateView(t *testing.T) { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestMigrateExistingBoolColumnPG(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	type ColumnStruct struct { | ||||
| 		gorm.Model | ||||
| 		Name         string | ||||
| 		StringBool   string | ||||
| 		SmallintBool int `gorm:"type:smallint"` | ||||
| 	} | ||||
| 
 | ||||
| 	type ColumnStruct2 struct { | ||||
| 		gorm.Model | ||||
| 		Name         string | ||||
| 		StringBool   bool // change existing boolean column from string to boolean
 | ||||
| 		SmallintBool bool // change existing boolean column from smallint or other to boolean
 | ||||
| 	} | ||||
| 
 | ||||
| 	DB.Migrator().DropTable(&ColumnStruct{}) | ||||
| 
 | ||||
| 	if err := DB.AutoMigrate(&ColumnStruct{}); err != nil { | ||||
| 		t.Errorf("Failed to migrate, got %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.Table("column_structs").AutoMigrate(&ColumnStruct2{}); err != nil { | ||||
| 		t.Fatalf("no error should happened when auto migrate column, but got %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if columnTypes, err := DB.Migrator().ColumnTypes(&ColumnStruct{}); err != nil { | ||||
| 		t.Fatalf("no error should returns for ColumnTypes") | ||||
| 	} else { | ||||
| 		stmt := &gorm.Statement{DB: DB} | ||||
| 		stmt.Parse(&ColumnStruct2{}) | ||||
| 
 | ||||
| 		for _, columnType := range columnTypes { | ||||
| 			switch columnType.Name() { | ||||
| 			case "id": | ||||
| 				if v, ok := columnType.PrimaryKey(); !ok || !v { | ||||
| 					t.Fatalf("column id primary key should be correct, name: %v, column: %#v", columnType.Name(), | ||||
| 						columnType) | ||||
| 				} | ||||
| 			case "string_bool": | ||||
| 				dataType := DB.Dialector.DataTypeOf(stmt.Schema.LookUpField(columnType.Name())) | ||||
| 				if !strings.Contains(strings.ToUpper(dataType), strings.ToUpper(columnType.DatabaseTypeName())) { | ||||
| 					t.Fatalf("column name type should be correct, name: %v, length: %v, expects: %v, column: %#v", | ||||
| 						columnType.Name(), columnType.DatabaseTypeName(), dataType, columnType) | ||||
| 				} | ||||
| 			case "smallint_bool": | ||||
| 				dataType := DB.Dialector.DataTypeOf(stmt.Schema.LookUpField(columnType.Name())) | ||||
| 				if !strings.Contains(strings.ToUpper(dataType), strings.ToUpper(columnType.DatabaseTypeName())) { | ||||
| 					t.Fatalf("column name type should be correct, name: %v, length: %v, expects: %v, column: %#v", | ||||
| 						columnType.Name(), columnType.DatabaseTypeName(), dataType, columnType) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestMigrateExistingBoolColumnGaussDB(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "gaussdb" { | ||||
| func TestMigrateExistingBoolColumnPGAndGaussDB(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "postgres" && DB.Dialector.Name() != "gaussdb" { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| @ -2320,7 +2126,7 @@ func TestAutoMigrateDecimal(t *testing.T) { | ||||
| 			`ALTER TABLE "migrate_decimal_columns" ALTER COLUMN "recid3" decimal(9,2) NOT NULL`, | ||||
| 		} | ||||
| 		decimalColumnsTest[MigrateDecimalColumn, MigrateDecimalColumn2](t, expectedSql) | ||||
| 	} else if DB.Dialector.Name() == "postgres" { | ||||
| 	} else if DB.Dialector.Name() == "postgres" || DB.Dialector.Name() == "gaussdb" { | ||||
| 		type MigrateDecimalColumn struct { | ||||
| 			RecID1 int64 `gorm:"column:recid1;type:numeric(9,0);not null" json:"recid1"` | ||||
| 			RecID2 int64 `gorm:"column:recid2;type:numeric(8);not null" json:"recid2"` | ||||
|  | ||||
| @ -12,7 +12,7 @@ import ( | ||||
| ) | ||||
| 
 | ||||
| func TestPostgresReturningIDWhichHasStringType(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" { | ||||
| 	if DB.Dialector.Name() != "postgres" { | ||||
| 		t.Skip() | ||||
| 	} | ||||
| 
 | ||||
| @ -62,7 +62,7 @@ func TestPostgresReturningIDWhichHasStringType(t *testing.T) { | ||||
| } | ||||
| 
 | ||||
| func TestPostgres(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" { | ||||
| 	if DB.Dialector.Name() != "postgres" { | ||||
| 		t.Skip() | ||||
| 	} | ||||
| 
 | ||||
| @ -166,7 +166,7 @@ type Category struct { | ||||
| } | ||||
| 
 | ||||
| func TestMany2ManyWithDefaultValueUUID(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" { | ||||
| 	if DB.Dialector.Name() != "postgres" { | ||||
| 		t.Skip() | ||||
| 	} | ||||
| 
 | ||||
| @ -191,7 +191,7 @@ func TestMany2ManyWithDefaultValueUUID(t *testing.T) { | ||||
| } | ||||
| 
 | ||||
| func TestPostgresOnConstraint(t *testing.T) { | ||||
| 	if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" { | ||||
| 	if DB.Dialector.Name() != "postgres" { | ||||
| 		t.Skip() | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -5,7 +5,7 @@ import ( | ||||
| 	"sync" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/moseszane168/gaussdb" | ||||
| 	"gorm.io/driver/gaussdb" | ||||
| 	"gorm.io/driver/postgres" | ||||
| 	"gorm.io/gorm" | ||||
| 	"gorm.io/gorm/schema" | ||||
|  | ||||
| @ -8,7 +8,7 @@ import ( | ||||
| 	"path/filepath" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/moseszane168/gaussdb" | ||||
| 	"gorm.io/driver/gaussdb" | ||||
| 	"gorm.io/driver/mysql" | ||||
| 	"gorm.io/driver/postgres" | ||||
| 	"gorm.io/driver/sqlite" | ||||
| @ -22,7 +22,7 @@ var DB *gorm.DB | ||||
| var ( | ||||
| 	mysqlDSN     = "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local" | ||||
| 	postgresDSN  = "user=gorm password=gorm dbname=gorm host=localhost port=9920 sslmode=disable TimeZone=Asia/Shanghai" | ||||
| 	gaussdbDSN   = "user=gaussdb password=Gaussdb@123 dbname=gorm host=localhost port=9920 sslmode=disable TimeZone=Asia/Shanghai" | ||||
| 	gaussdbDSN   = "user=gaussdb password=Gaussdb@123 dbname=gorm host=localhost port=9950 sslmode=disable TimeZone=Asia/Shanghai" | ||||
| 	sqlserverDSN = "sqlserver://sa:LoremIpsum86@localhost:9930?database=master" | ||||
| 	tidbDSN      = "root:@tcp(localhost:9940)/test?charset=utf8&parseTime=True&loc=Local" | ||||
| ) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 moseszane168
						moseszane168