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/jinzhu/now v1.1.5
|
||||||
github.com/lib/pq v1.10.9
|
github.com/lib/pq v1.10.9
|
||||||
github.com/stretchr/testify v1.10.0
|
github.com/stretchr/testify v1.10.0
|
||||||
|
gorm.io/driver/gaussdb v0.1.0
|
||||||
gorm.io/driver/mysql v1.6.0
|
gorm.io/driver/mysql v1.6.0
|
||||||
gorm.io/driver/postgres v1.6.0
|
gorm.io/driver/postgres v1.6.0
|
||||||
gorm.io/driver/sqlite v1.6.0
|
gorm.io/driver/sqlite v1.6.0
|
||||||
@ -16,6 +17,7 @@ require (
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
filippo.io/edwards25519 v1.1.0 // indirect
|
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/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/go-sql-driver/mysql v1.9.2 // indirect
|
github.com/go-sql-driver/mysql v1.9.2 // indirect
|
||||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
|
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
|
||||||
@ -30,6 +32,7 @@ require (
|
|||||||
github.com/microsoft/go-mssqldb v1.8.2 // indirect
|
github.com/microsoft/go-mssqldb v1.8.2 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/rogpeppe/go-internal v1.12.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/crypto v0.38.0 // indirect
|
||||||
golang.org/x/sync v0.14.0 // indirect
|
golang.org/x/sync v0.14.0 // indirect
|
||||||
golang.org/x/text v0.25.0 // indirect
|
golang.org/x/text v0.25.0 // indirect
|
||||||
|
@ -11,8 +11,8 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/moseszane168/gaussdb"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"gorm.io/driver/gaussdb"
|
||||||
"gorm.io/driver/postgres"
|
"gorm.io/driver/postgres"
|
||||||
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
@ -83,46 +83,8 @@ func TestMigrate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAutoMigrateInt8PG(t *testing.T) {
|
func TestAutoMigrateInt8PGAndGaussDB(t *testing.T) {
|
||||||
if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" {
|
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" {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -976,68 +938,7 @@ func TestMigrateColumnOrder(t *testing.T) {
|
|||||||
|
|
||||||
// https://github.com/go-gorm/gorm/issues/5047
|
// https://github.com/go-gorm/gorm/issues/5047
|
||||||
func TestMigrateSerialColumn(t *testing.T) {
|
func TestMigrateSerialColumn(t *testing.T) {
|
||||||
if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" {
|
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" {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1162,7 +1063,7 @@ func TestMigrateAutoIncrement(t *testing.T) {
|
|||||||
|
|
||||||
// https://github.com/go-gorm/gorm/issues/5320
|
// https://github.com/go-gorm/gorm/issues/5320
|
||||||
func TestPrimarykeyID(t *testing.T) {
|
func TestPrimarykeyID(t *testing.T) {
|
||||||
if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" {
|
if DB.Dialector.Name() != "postgres" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1398,7 +1299,7 @@ func findColumnType(dest interface{}, columnName string) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestInvalidCachedPlanSimpleProtocol(t *testing.T) {
|
func TestInvalidCachedPlanSimpleProtocol(t *testing.T) {
|
||||||
if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" {
|
if DB.Dialector.Name() != "postgres" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1509,43 +1410,7 @@ func TestDifferentTypeWithoutDeclaredLength(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestMigrateArrayTypeModel(t *testing.T) {
|
func TestMigrateArrayTypeModel(t *testing.T) {
|
||||||
if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" {
|
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" {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1867,67 +1732,8 @@ func TestMigrateView(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMigrateExistingBoolColumnPG(t *testing.T) {
|
func TestMigrateExistingBoolColumnPGAndGaussDB(t *testing.T) {
|
||||||
if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" {
|
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" {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2320,7 +2126,7 @@ func TestAutoMigrateDecimal(t *testing.T) {
|
|||||||
`ALTER TABLE "migrate_decimal_columns" ALTER COLUMN "recid3" decimal(9,2) NOT NULL`,
|
`ALTER TABLE "migrate_decimal_columns" ALTER COLUMN "recid3" decimal(9,2) NOT NULL`,
|
||||||
}
|
}
|
||||||
decimalColumnsTest[MigrateDecimalColumn, MigrateDecimalColumn2](t, expectedSql)
|
decimalColumnsTest[MigrateDecimalColumn, MigrateDecimalColumn2](t, expectedSql)
|
||||||
} else if DB.Dialector.Name() == "postgres" {
|
} else if DB.Dialector.Name() == "postgres" || DB.Dialector.Name() == "gaussdb" {
|
||||||
type MigrateDecimalColumn struct {
|
type MigrateDecimalColumn struct {
|
||||||
RecID1 int64 `gorm:"column:recid1;type:numeric(9,0);not null" json:"recid1"`
|
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"`
|
RecID2 int64 `gorm:"column:recid2;type:numeric(8);not null" json:"recid2"`
|
||||||
|
@ -12,7 +12,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestPostgresReturningIDWhichHasStringType(t *testing.T) {
|
func TestPostgresReturningIDWhichHasStringType(t *testing.T) {
|
||||||
if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" {
|
if DB.Dialector.Name() != "postgres" {
|
||||||
t.Skip()
|
t.Skip()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ func TestPostgresReturningIDWhichHasStringType(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestPostgres(t *testing.T) {
|
func TestPostgres(t *testing.T) {
|
||||||
if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" {
|
if DB.Dialector.Name() != "postgres" {
|
||||||
t.Skip()
|
t.Skip()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ type Category struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestMany2ManyWithDefaultValueUUID(t *testing.T) {
|
func TestMany2ManyWithDefaultValueUUID(t *testing.T) {
|
||||||
if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" {
|
if DB.Dialector.Name() != "postgres" {
|
||||||
t.Skip()
|
t.Skip()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,7 +191,7 @@ func TestMany2ManyWithDefaultValueUUID(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestPostgresOnConstraint(t *testing.T) {
|
func TestPostgresOnConstraint(t *testing.T) {
|
||||||
if DB.Dialector.Name() != "postgres" || DB.Dialector.Name() != "gaussdb" {
|
if DB.Dialector.Name() != "postgres" {
|
||||||
t.Skip()
|
t.Skip()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/moseszane168/gaussdb"
|
"gorm.io/driver/gaussdb"
|
||||||
"gorm.io/driver/postgres"
|
"gorm.io/driver/postgres"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"gorm.io/gorm/schema"
|
"gorm.io/gorm/schema"
|
||||||
|
@ -8,7 +8,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/moseszane168/gaussdb"
|
"gorm.io/driver/gaussdb"
|
||||||
"gorm.io/driver/mysql"
|
"gorm.io/driver/mysql"
|
||||||
"gorm.io/driver/postgres"
|
"gorm.io/driver/postgres"
|
||||||
"gorm.io/driver/sqlite"
|
"gorm.io/driver/sqlite"
|
||||||
@ -22,7 +22,7 @@ var DB *gorm.DB
|
|||||||
var (
|
var (
|
||||||
mysqlDSN = "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local"
|
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"
|
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"
|
sqlserverDSN = "sqlserver://sa:LoremIpsum86@localhost:9930?database=master"
|
||||||
tidbDSN = "root:@tcp(localhost:9940)/test?charset=utf8&parseTime=True&loc=Local"
|
tidbDSN = "root:@tcp(localhost:9940)/test?charset=utf8&parseTime=True&loc=Local"
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user