diff --git a/contrib/drivers/mysql/mysql_z_unit_feature_hook_test.go b/contrib/drivers/mysql/mysql_z_unit_feature_hook_test.go index 4c97ab83c..4d91ca8ae 100644 --- a/contrib/drivers/mysql/mysql_z_unit_feature_hook_test.go +++ b/contrib/drivers/mysql/mysql_z_unit_feature_hook_test.go @@ -7,129 +7,129 @@ package mysql_test import ( - "context" - "database/sql" - "fmt" - "testing" + "context" + "database/sql" + "fmt" + "testing" - "github.com/gogf/gf/v2/database/gdb" - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/test/gtest" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/test/gtest" ) func Test_Model_Hook_Select(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - m := db.Model(table).Hook(gdb.HookHandler{ - Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { - result, err = in.Next(ctx) - if err != nil { - return - } - for i, record := range result { - record["test"] = gdb.NewValue(100 + record["id"].Int()) - result[i] = record - } - return - }, - }) - all, err := m.Where(`id > 6`).OrderAsc(`id`).All() - t.AssertNil(err) - t.Assert(len(all), 4) - t.Assert(all[0]["id"].Int(), 7) - t.Assert(all[0]["test"].Int(), 107) - t.Assert(all[1]["test"].Int(), 108) - t.Assert(all[2]["test"].Int(), 109) - t.Assert(all[3]["test"].Int(), 110) - }) + gtest.C(t, func(t *gtest.T) { + m := db.Model(table).Hook(gdb.HookHandler{ + Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { + result, err = in.Next(ctx) + if err != nil { + return + } + for i, record := range result { + record["test"] = gdb.NewValue(100 + record["id"].Int()) + result[i] = record + } + return + }, + }) + all, err := m.Where(`id > 6`).OrderAsc(`id`).All() + t.AssertNil(err) + t.Assert(len(all), 4) + t.Assert(all[0]["id"].Int(), 7) + t.Assert(all[0]["test"].Int(), 107) + t.Assert(all[1]["test"].Int(), 108) + t.Assert(all[2]["test"].Int(), 109) + t.Assert(all[3]["test"].Int(), 110) + }) } func Test_Model_Hook_Insert(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - m := db.Model(table).Hook(gdb.HookHandler{ - Insert: func(ctx context.Context, in *gdb.HookInsertInput) (result sql.Result, err error) { - for i, item := range in.Data { - item["passport"] = fmt.Sprintf(`test_port_%d`, item["id"]) - item["nickname"] = fmt.Sprintf(`test_name_%d`, item["id"]) - in.Data[i] = item - } - return in.Next(ctx) - }, - }) - _, err := m.Insert(g.Map{ - "id": 1, - "nickname": "name_1", - }) - t.AssertNil(err) - one, err := m.One() - t.AssertNil(err) - t.Assert(one["id"].Int(), 1) - t.Assert(one["passport"], `test_port_1`) - t.Assert(one["nickname"], `test_name_1`) - }) + gtest.C(t, func(t *gtest.T) { + m := db.Model(table).Hook(gdb.HookHandler{ + Insert: func(ctx context.Context, in *gdb.HookInsertInput) (result sql.Result, err error) { + for i, item := range in.Data { + item["passport"] = fmt.Sprintf(`test_port_%d`, item["id"]) + item["nickname"] = fmt.Sprintf(`test_name_%d`, item["id"]) + in.Data[i] = item + } + return in.Next(ctx) + }, + }) + _, err := m.Insert(g.Map{ + "id": 1, + "nickname": "name_1", + }) + t.AssertNil(err) + one, err := m.One() + t.AssertNil(err) + t.Assert(one["id"].Int(), 1) + t.Assert(one["passport"], `test_port_1`) + t.Assert(one["nickname"], `test_name_1`) + }) } func Test_Model_Hook_Update(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - m := db.Model(table).Hook(gdb.HookHandler{ - Update: func(ctx context.Context, in *gdb.HookUpdateInput) (result sql.Result, err error) { - switch value := in.Data.(type) { - case gdb.List: - for i, data := range value { - data["passport"] = `port` - data["nickname"] = `name` - value[i] = data - } - in.Data = value + gtest.C(t, func(t *gtest.T) { + m := db.Model(table).Hook(gdb.HookHandler{ + Update: func(ctx context.Context, in *gdb.HookUpdateInput) (result sql.Result, err error) { + switch value := in.Data.(type) { + case gdb.List: + for i, data := range value { + data["passport"] = `port` + data["nickname"] = `name` + value[i] = data + } + in.Data = value - case gdb.Map: - value["passport"] = `port` - value["nickname"] = `name` - in.Data = value - } - return in.Next(ctx) - }, - }) - _, err := m.Data(g.Map{ - "nickname": "name_1", - }).WherePri(1).Update() - t.AssertNil(err) + case gdb.Map: + value["passport"] = `port` + value["nickname"] = `name` + in.Data = value + } + return in.Next(ctx) + }, + }) + _, err := m.Data(g.Map{ + "nickname": "name_1", + }).WherePri(1).Update() + t.AssertNil(err) - one, err := m.One() - t.AssertNil(err) - t.Assert(one["id"].Int(), 1) - t.Assert(one["passport"], `port`) - t.Assert(one["nickname"], `name`) - }) + one, err := m.One() + t.AssertNil(err) + t.Assert(one["id"].Int(), 1) + t.Assert(one["passport"], `port`) + t.Assert(one["nickname"], `name`) + }) } func Test_Model_Hook_Delete(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - m := db.Model(table).Hook(gdb.HookHandler{ - Delete: func(ctx context.Context, in *gdb.HookDeleteInput) (result sql.Result, err error) { - return db.Model(table).Data(g.Map{ - "nickname": `deleted`, - }).Where(in.Condition).Update() - }, - }) - _, err := m.Where(1).Delete() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + m := db.Model(table).Hook(gdb.HookHandler{ + Delete: func(ctx context.Context, in *gdb.HookDeleteInput) (result sql.Result, err error) { + return db.Model(table).Data(g.Map{ + "nickname": `deleted`, + }).Where(in.Condition).Update() + }, + }) + _, err := m.Where(1).Delete() + t.AssertNil(err) - all, err := m.All() - t.AssertNil(err) - for _, item := range all { - t.Assert(item["nickname"].String(), `deleted`) - } - }) + all, err := m.All() + t.AssertNil(err) + for _, item := range all { + t.Assert(item["nickname"].String(), `deleted`) + } + }) } diff --git a/contrib/drivers/mysql/mysql_z_unit_feature_model_struct_test.go b/contrib/drivers/mysql/mysql_z_unit_feature_model_struct_test.go index edf594d96..1463c4080 100644 --- a/contrib/drivers/mysql/mysql_z_unit_feature_model_struct_test.go +++ b/contrib/drivers/mysql/mysql_z_unit_feature_model_struct_test.go @@ -7,476 +7,476 @@ package mysql_test import ( - "database/sql" - "reflect" - "testing" + "database/sql" + "reflect" + "testing" - "github.com/gogf/gf/v2/database/gdb" - "github.com/gogf/gf/v2/errors/gcode" - "github.com/gogf/gf/v2/errors/gerror" - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/os/gtime" - "github.com/gogf/gf/v2/test/gtest" - "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/errors/gcode" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/test/gtest" + "github.com/gogf/gf/v2/util/gconv" ) func Test_Model_Embedded_Insert(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type Base struct { - Id int `json:"id"` - Uid int `json:"uid"` - CreateTime string `json:"create_time"` - } - type User struct { - Base - Passport string `json:"passport"` - Password string `json:"password"` - Nickname string `json:"nickname"` - } - result, err := db.Model(table).Data(User{ - Passport: "john-test", - Password: "123456", - Nickname: "John", - Base: Base{ - Id: 100, - Uid: 100, - CreateTime: gtime.Now().String(), - }, - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - value, err := db.Model(table).Fields("passport").Where("id=100").Value() - t.AssertNil(err) - t.Assert(value.String(), "john-test") - }) + gtest.C(t, func(t *gtest.T) { + type Base struct { + Id int `json:"id"` + Uid int `json:"uid"` + CreateTime string `json:"create_time"` + } + type User struct { + Base + Passport string `json:"passport"` + Password string `json:"password"` + Nickname string `json:"nickname"` + } + result, err := db.Model(table).Data(User{ + Passport: "john-test", + Password: "123456", + Nickname: "John", + Base: Base{ + Id: 100, + Uid: 100, + CreateTime: gtime.Now().String(), + }, + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + value, err := db.Model(table).Fields("passport").Where("id=100").Value() + t.AssertNil(err) + t.Assert(value.String(), "john-test") + }) } func Test_Model_Embedded_MapToStruct(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type Ids struct { - Id int `json:"id"` - Uid int `json:"uid"` - } - type Base struct { - Ids - CreateTime string `json:"create_time"` - } - type User struct { - Base - Passport string `json:"passport"` - Password string `json:"password"` - Nickname string `json:"nickname"` - } - data := g.Map{ - "id": 100, - "uid": 101, - "passport": "t1", - "password": "123456", - "nickname": "T1", - "create_time": gtime.Now().String(), - } - result, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) + gtest.C(t, func(t *gtest.T) { + type Ids struct { + Id int `json:"id"` + Uid int `json:"uid"` + } + type Base struct { + Ids + CreateTime string `json:"create_time"` + } + type User struct { + Base + Passport string `json:"passport"` + Password string `json:"password"` + Nickname string `json:"nickname"` + } + data := g.Map{ + "id": 100, + "uid": 101, + "passport": "t1", + "password": "123456", + "nickname": "T1", + "create_time": gtime.Now().String(), + } + result, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) - one, err := db.Model(table).Where("id=100").One() - t.AssertNil(err) + one, err := db.Model(table).Where("id=100").One() + t.AssertNil(err) - user := new(User) + user := new(User) - t.Assert(one.Struct(user), nil) - t.Assert(user.Id, data["id"]) - t.Assert(user.Passport, data["passport"]) - t.Assert(user.Password, data["password"]) - t.Assert(user.Nickname, data["nickname"]) - t.Assert(user.CreateTime, data["create_time"]) - }) + t.Assert(one.Struct(user), nil) + t.Assert(user.Id, data["id"]) + t.Assert(user.Passport, data["passport"]) + t.Assert(user.Password, data["password"]) + t.Assert(user.Nickname, data["nickname"]) + t.Assert(user.CreateTime, data["create_time"]) + }) } func Test_Struct_Pointer_Attribute(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type User struct { - Id *int - Passport *string - Password *string - Nickname string - } + type User struct { + Id *int + Passport *string + Password *string + Nickname string + } - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - user := new(User) - err = one.Struct(user) - t.AssertNil(err) - t.Assert(*user.Id, 1) - t.Assert(*user.Passport, "user_1") - t.Assert(*user.Password, "pass_1") - t.Assert(user.Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - user := new(User) - err := db.Model(table).Scan(user, "id=1") - t.AssertNil(err) - t.Assert(*user.Id, 1) - t.Assert(*user.Passport, "user_1") - t.Assert(*user.Password, "pass_1") - t.Assert(user.Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - var user *User - err := db.Model(table).Scan(&user, "id=1") - t.AssertNil(err) - t.Assert(*user.Id, 1) - t.Assert(*user.Passport, "user_1") - t.Assert(*user.Password, "pass_1") - t.Assert(user.Nickname, "name_1") - }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + user := new(User) + err = one.Struct(user) + t.AssertNil(err) + t.Assert(*user.Id, 1) + t.Assert(*user.Passport, "user_1") + t.Assert(*user.Password, "pass_1") + t.Assert(user.Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + user := new(User) + err := db.Model(table).Scan(user, "id=1") + t.AssertNil(err) + t.Assert(*user.Id, 1) + t.Assert(*user.Passport, "user_1") + t.Assert(*user.Password, "pass_1") + t.Assert(user.Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + var user *User + err := db.Model(table).Scan(&user, "id=1") + t.AssertNil(err) + t.Assert(*user.Id, 1) + t.Assert(*user.Passport, "user_1") + t.Assert(*user.Password, "pass_1") + t.Assert(user.Nickname, "name_1") + }) } func Test_Structs_Pointer_Attribute(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type User struct { - Id *int - Passport *string - Password *string - Nickname string - } - // All - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).All("id < 3") - t.AssertNil(err) - users := make([]User, 0) - err = one.Structs(&users) - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).All("id < 3") - t.AssertNil(err) - users := make([]*User, 0) - err = one.Structs(&users) - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - var users []User - one, err := db.Model(table).All("id < 3") - t.AssertNil(err) - err = one.Structs(&users) - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - var users []*User - one, err := db.Model(table).All("id < 3") - t.AssertNil(err) - err = one.Structs(&users) - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - // Structs - gtest.C(t, func(t *gtest.T) { - users := make([]User, 0) - err := db.Model(table).Scan(&users, "id < 3") - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - users := make([]*User, 0) - err := db.Model(table).Scan(&users, "id < 3") - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - var users []User - err := db.Model(table).Scan(&users, "id < 3") - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - var users []*User - err := db.Model(table).Scan(&users, "id < 3") - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) + type User struct { + Id *int + Passport *string + Password *string + Nickname string + } + // All + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).All("id < 3") + t.AssertNil(err) + users := make([]User, 0) + err = one.Structs(&users) + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).All("id < 3") + t.AssertNil(err) + users := make([]*User, 0) + err = one.Structs(&users) + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + var users []User + one, err := db.Model(table).All("id < 3") + t.AssertNil(err) + err = one.Structs(&users) + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + var users []*User + one, err := db.Model(table).All("id < 3") + t.AssertNil(err) + err = one.Structs(&users) + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + // Structs + gtest.C(t, func(t *gtest.T) { + users := make([]User, 0) + err := db.Model(table).Scan(&users, "id < 3") + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + users := make([]*User, 0) + err := db.Model(table).Scan(&users, "id < 3") + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + var users []User + err := db.Model(table).Scan(&users, "id < 3") + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + var users []*User + err := db.Model(table).Scan(&users, "id < 3") + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) } func Test_Struct_Empty(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - type User struct { - Id int - Passport string - Password string - Nickname string - } + type User struct { + Id int + Passport string + Password string + Nickname string + } - gtest.C(t, func(t *gtest.T) { - user := new(User) - err := db.Model(table).Where("id=100").Scan(user) - t.Assert(err, sql.ErrNoRows) - t.AssertNE(user, nil) - }) + gtest.C(t, func(t *gtest.T) { + user := new(User) + err := db.Model(table).Where("id=100").Scan(user) + t.Assert(err, sql.ErrNoRows) + t.AssertNE(user, nil) + }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Where("id=100").One() - t.AssertNil(err) - var user *User - t.Assert(one.Struct(&user), nil) - t.Assert(user, nil) - }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Where("id=100").One() + t.AssertNil(err) + var user *User + t.Assert(one.Struct(&user), nil) + t.Assert(user, nil) + }) - gtest.C(t, func(t *gtest.T) { - var user *User - err := db.Model(table).Where("id=100").Scan(&user) - t.AssertNil(err) - t.Assert(user, nil) - }) + gtest.C(t, func(t *gtest.T) { + var user *User + err := db.Model(table).Where("id=100").Scan(&user) + t.AssertNil(err) + t.Assert(user, nil) + }) } func Test_Structs_Empty(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - type User struct { - Id int - Passport string - Password string - Nickname string - } + type User struct { + Id int + Passport string + Password string + Nickname string + } - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id>100").All() - t.AssertNil(err) - users := make([]User, 0) - t.Assert(all.Structs(&users), nil) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id>100").All() - t.AssertNil(err) - users := make([]User, 10) - t.Assert(all.Structs(&users), sql.ErrNoRows) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id>100").All() - t.AssertNil(err) - var users []User - t.Assert(all.Structs(&users), nil) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id>100").All() + t.AssertNil(err) + users := make([]User, 0) + t.Assert(all.Structs(&users), nil) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id>100").All() + t.AssertNil(err) + users := make([]User, 10) + t.Assert(all.Structs(&users), sql.ErrNoRows) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id>100").All() + t.AssertNil(err) + var users []User + t.Assert(all.Structs(&users), nil) + }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id>100").All() - t.AssertNil(err) - users := make([]*User, 0) - t.Assert(all.Structs(&users), nil) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id>100").All() - t.AssertNil(err) - users := make([]*User, 10) - t.Assert(all.Structs(&users), sql.ErrNoRows) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id>100").All() - t.AssertNil(err) - var users []*User - t.Assert(all.Structs(&users), nil) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id>100").All() + t.AssertNil(err) + users := make([]*User, 0) + t.Assert(all.Structs(&users), nil) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id>100").All() + t.AssertNil(err) + users := make([]*User, 10) + t.Assert(all.Structs(&users), sql.ErrNoRows) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id>100").All() + t.AssertNil(err) + var users []*User + t.Assert(all.Structs(&users), nil) + }) } type MyTime struct { - gtime.Time + gtime.Time } type MyTimeSt struct { - CreateTime MyTime + CreateTime MyTime } func (st *MyTimeSt) UnmarshalValue(v interface{}) error { - m := gconv.Map(v) - t, err := gtime.StrToTime(gconv.String(m["create_time"])) - if err != nil { - return err - } - st.CreateTime = MyTime{*t} - return nil + m := gconv.Map(v) + t, err := gtime.StrToTime(gconv.String(m["create_time"])) + if err != nil { + return err + } + st.CreateTime = MyTime{*t} + return nil } func Test_Model_Scan_CustomType_Time(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - st := new(MyTimeSt) - err := db.Model(table).Fields("create_time").Scan(st) - t.AssertNil(err) - t.Assert(st.CreateTime.String(), "2018-10-24 10:00:00") - }) - gtest.C(t, func(t *gtest.T) { - var stSlice []*MyTimeSt - err := db.Model(table).Fields("create_time").Scan(&stSlice) - t.AssertNil(err) - t.Assert(len(stSlice), TableSize) - t.Assert(stSlice[0].CreateTime.String(), "2018-10-24 10:00:00") - t.Assert(stSlice[9].CreateTime.String(), "2018-10-24 10:00:00") - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + st := new(MyTimeSt) + err := db.Model(table).Fields("create_time").Scan(st) + t.AssertNil(err) + t.Assert(st.CreateTime.String(), "2018-10-24 10:00:00") + }) + gtest.C(t, func(t *gtest.T) { + var stSlice []*MyTimeSt + err := db.Model(table).Fields("create_time").Scan(&stSlice) + t.AssertNil(err) + t.Assert(len(stSlice), TableSize) + t.Assert(stSlice[0].CreateTime.String(), "2018-10-24 10:00:00") + t.Assert(stSlice[9].CreateTime.String(), "2018-10-24 10:00:00") + }) } func Test_Model_Scan_CustomType_String(t *testing.T) { - type MyString string + type MyString string - type MyStringSt struct { - Passport MyString - } + type MyStringSt struct { + Passport MyString + } - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - st := new(MyStringSt) - err := db.Model(table).Fields("Passport").WherePri(1).Scan(st) - t.AssertNil(err) - t.Assert(st.Passport, "user_1") - }) - gtest.C(t, func(t *gtest.T) { - var sts []MyStringSt - err := db.Model(table).Fields("Passport").Order("id asc").Scan(&sts) - t.AssertNil(err) - t.Assert(len(sts), TableSize) - t.Assert(sts[0].Passport, "user_1") - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + st := new(MyStringSt) + err := db.Model(table).Fields("Passport").WherePri(1).Scan(st) + t.AssertNil(err) + t.Assert(st.Passport, "user_1") + }) + gtest.C(t, func(t *gtest.T) { + var sts []MyStringSt + err := db.Model(table).Fields("Passport").Order("id asc").Scan(&sts) + t.AssertNil(err) + t.Assert(len(sts), TableSize) + t.Assert(sts[0].Passport, "user_1") + }) } type User struct { - Id int - Passport string - Password string - Nickname string - CreateTime *gtime.Time + Id int + Passport string + Password string + Nickname string + CreateTime *gtime.Time } func (user *User) UnmarshalValue(value interface{}) error { - if record, ok := value.(gdb.Record); ok { - *user = User{ - Id: record["id"].Int(), - Passport: record["passport"].String(), - Password: "", - Nickname: record["nickname"].String(), - CreateTime: record["create_time"].GTime(), - } - return nil - } - return gerror.NewCodef(gcode.CodeInvalidParameter, `unsupported value type for UnmarshalValue: %v`, reflect.TypeOf(value)) + if record, ok := value.(gdb.Record); ok { + *user = User{ + Id: record["id"].Int(), + Passport: record["passport"].String(), + Password: "", + Nickname: record["nickname"].String(), + CreateTime: record["create_time"].GTime(), + } + return nil + } + return gerror.NewCodef(gcode.CodeInvalidParameter, `unsupported value type for UnmarshalValue: %v`, reflect.TypeOf(value)) } func Test_Model_Scan_UnmarshalValue(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - var users []*User - err := db.Model(table).Order("id asc").Scan(&users) - t.AssertNil(err) - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[0].Passport, "user_1") - t.Assert(users[0].Password, "") - t.Assert(users[0].Nickname, "name_1") - t.Assert(users[0].CreateTime.String(), CreateTime) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + var users []*User + err := db.Model(table).Order("id asc").Scan(&users) + t.AssertNil(err) + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[0].Passport, "user_1") + t.Assert(users[0].Password, "") + t.Assert(users[0].Nickname, "name_1") + t.Assert(users[0].CreateTime.String(), CreateTime) - t.Assert(users[9].Id, 10) - t.Assert(users[9].Passport, "user_10") - t.Assert(users[9].Password, "") - t.Assert(users[9].Nickname, "name_10") - t.Assert(users[9].CreateTime.String(), CreateTime) - }) + t.Assert(users[9].Id, 10) + t.Assert(users[9].Passport, "user_10") + t.Assert(users[9].Password, "") + t.Assert(users[9].Nickname, "name_10") + t.Assert(users[9].CreateTime.String(), CreateTime) + }) } func Test_Model_Scan_Map(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - var users []*User - err := db.Model(table).Order("id asc").Scan(&users) - t.AssertNil(err) - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[0].Passport, "user_1") - t.Assert(users[0].Password, "") - t.Assert(users[0].Nickname, "name_1") - t.Assert(users[0].CreateTime.String(), CreateTime) + gtest.C(t, func(t *gtest.T) { + var users []*User + err := db.Model(table).Order("id asc").Scan(&users) + t.AssertNil(err) + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[0].Passport, "user_1") + t.Assert(users[0].Password, "") + t.Assert(users[0].Nickname, "name_1") + t.Assert(users[0].CreateTime.String(), CreateTime) - t.Assert(users[9].Id, 10) - t.Assert(users[9].Passport, "user_10") - t.Assert(users[9].Password, "") - t.Assert(users[9].Nickname, "name_10") - t.Assert(users[9].CreateTime.String(), CreateTime) - }) + t.Assert(users[9].Id, 10) + t.Assert(users[9].Passport, "user_10") + t.Assert(users[9].Password, "") + t.Assert(users[9].Nickname, "name_10") + t.Assert(users[9].CreateTime.String(), CreateTime) + }) } func Test_Scan_AutoFilteringByStructAttributes(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type User struct { - Id int - Passport string - } - // db.SetDebug(true) - gtest.C(t, func(t *gtest.T) { - var user *User - err := db.Model(table).OrderAsc("id").Scan(&user) - t.AssertNil(err) - t.Assert(user.Id, 1) - }) - gtest.C(t, func(t *gtest.T) { - var users []User - err := db.Model(table).OrderAsc("id").Scan(&users) - t.AssertNil(err) - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - }) + type User struct { + Id int + Passport string + } + // db.SetDebug(true) + gtest.C(t, func(t *gtest.T) { + var user *User + err := db.Model(table).OrderAsc("id").Scan(&user) + t.AssertNil(err) + t.Assert(user.Id, 1) + }) + gtest.C(t, func(t *gtest.T) { + var users []User + err := db.Model(table).OrderAsc("id").Scan(&users) + t.AssertNil(err) + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + }) } diff --git a/contrib/drivers/mysql/mysql_z_unit_issue_test.go b/contrib/drivers/mysql/mysql_z_unit_issue_test.go index 2b909c85f..68a23087f 100644 --- a/contrib/drivers/mysql/mysql_z_unit_issue_test.go +++ b/contrib/drivers/mysql/mysql_z_unit_issue_test.go @@ -7,180 +7,180 @@ package mysql_test import ( - "context" - "encoding/json" - "fmt" - "sync" - "testing" - "time" + "context" + "encoding/json" + "fmt" + "sync" + "testing" + "time" - "github.com/gogf/gf/v2/database/gdb" - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/os/gtime" - "github.com/gogf/gf/v2/test/gtest" - "github.com/gogf/gf/v2/text/gregex" - "github.com/gogf/gf/v2/text/gstr" - "github.com/gogf/gf/v2/util/gmeta" - "github.com/gogf/gf/v2/util/guid" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/test/gtest" + "github.com/gogf/gf/v2/text/gregex" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gmeta" + "github.com/gogf/gf/v2/util/guid" ) // https://github.com/gogf/gf/issues/1380 func Test_Issue1380(t *testing.T) { - type GiftImage struct { - Uid string `json:"uid"` - Url string `json:"url"` - Status string `json:"status"` - Name string `json:"name"` - } + type GiftImage struct { + Uid string `json:"uid"` + Url string `json:"url"` + Status string `json:"status"` + Name string `json:"name"` + } - type GiftComment struct { - Name string `json:"name"` - Field string `json:"field"` - Required bool `json:"required"` - } + type GiftComment struct { + Name string `json:"name"` + Field string `json:"field"` + Required bool `json:"required"` + } - type Prop struct { - Name string `json:"name"` - Values []string `json:"values"` - } + type Prop struct { + Name string `json:"name"` + Values []string `json:"values"` + } - type Sku struct { - GiftId int64 `json:"gift_id"` - Name string `json:"name"` - ScorePrice int `json:"score_price"` - MarketPrice int `json:"market_price"` - CostPrice int `json:"cost_price"` - Stock int `json:"stock"` - } + type Sku struct { + GiftId int64 `json:"gift_id"` + Name string `json:"name"` + ScorePrice int `json:"score_price"` + MarketPrice int `json:"market_price"` + CostPrice int `json:"cost_price"` + Stock int `json:"stock"` + } - type Covers struct { - List []GiftImage `json:"list"` - } + type Covers struct { + List []GiftImage `json:"list"` + } - type GiftEntity struct { - Id int64 `json:"id"` - StoreId int64 `json:"store_id"` - GiftType int `json:"gift_type"` - GiftName string `json:"gift_name"` - Description string `json:"description"` - Covers Covers `json:"covers"` - Cover string `json:"cover"` - GiftCategoryId []int64 `json:"gift_category_id"` - HasProps bool `json:"has_props"` - OutSn string `json:"out_sn"` - IsLimitSell bool `json:"is_limit_sell"` - LimitSellType int `json:"limit_sell_type"` - LimitSellCycle string `json:"limit_sell_cycle"` - LimitSellCycleCount int `json:"limit_sell_cycle_count"` - LimitSellCustom bool `json:"limit_sell_custom"` // 只允许特定会员兑换 - LimitCustomerTags []int64 `json:"limit_customer_tags"` // 允许兑换的成员 - ScorePrice int `json:"score_price"` - MarketPrice float64 `json:"market_price"` - CostPrice int `json:"cost_price"` - Stock int `json:"stock"` - Props []Prop `json:"props"` - Skus []Sku `json:"skus"` - ExpressType []string `json:"express_type"` - Comments []GiftComment `json:"comments"` - Content string `json:"content"` - AtLeastRechargeCount int `json:"at_least_recharge_count"` - Status int `json:"status"` - } + type GiftEntity struct { + Id int64 `json:"id"` + StoreId int64 `json:"store_id"` + GiftType int `json:"gift_type"` + GiftName string `json:"gift_name"` + Description string `json:"description"` + Covers Covers `json:"covers"` + Cover string `json:"cover"` + GiftCategoryId []int64 `json:"gift_category_id"` + HasProps bool `json:"has_props"` + OutSn string `json:"out_sn"` + IsLimitSell bool `json:"is_limit_sell"` + LimitSellType int `json:"limit_sell_type"` + LimitSellCycle string `json:"limit_sell_cycle"` + LimitSellCycleCount int `json:"limit_sell_cycle_count"` + LimitSellCustom bool `json:"limit_sell_custom"` // 只允许特定会员兑换 + LimitCustomerTags []int64 `json:"limit_customer_tags"` // 允许兑换的成员 + ScorePrice int `json:"score_price"` + MarketPrice float64 `json:"market_price"` + CostPrice int `json:"cost_price"` + Stock int `json:"stock"` + Props []Prop `json:"props"` + Skus []Sku `json:"skus"` + ExpressType []string `json:"express_type"` + Comments []GiftComment `json:"comments"` + Content string `json:"content"` + AtLeastRechargeCount int `json:"at_least_recharge_count"` + Status int `json:"status"` + } - type User struct { - Id int - Passport string - } + type User struct { + Id int + Passport string + } - table := "jfy_gift" - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `1380.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) + table := "jfy_gift" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `1380.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - var ( - entity = new(GiftEntity) - err = db.Model(table).Where("id", 17).Scan(entity) - ) - t.AssertNil(err) - t.Assert(len(entity.Skus), 2) + gtest.C(t, func(t *gtest.T) { + var ( + entity = new(GiftEntity) + err = db.Model(table).Where("id", 17).Scan(entity) + ) + t.AssertNil(err) + t.Assert(len(entity.Skus), 2) - t.Assert(entity.Skus[0].Name, "red") - t.Assert(entity.Skus[0].Stock, 10) - t.Assert(entity.Skus[0].GiftId, 1) - t.Assert(entity.Skus[0].CostPrice, 80) - t.Assert(entity.Skus[0].ScorePrice, 188) - t.Assert(entity.Skus[0].MarketPrice, 388) + t.Assert(entity.Skus[0].Name, "red") + t.Assert(entity.Skus[0].Stock, 10) + t.Assert(entity.Skus[0].GiftId, 1) + t.Assert(entity.Skus[0].CostPrice, 80) + t.Assert(entity.Skus[0].ScorePrice, 188) + t.Assert(entity.Skus[0].MarketPrice, 388) - t.Assert(entity.Skus[1].Name, "blue") - t.Assert(entity.Skus[1].Stock, 100) - t.Assert(entity.Skus[1].GiftId, 2) - t.Assert(entity.Skus[1].CostPrice, 81) - t.Assert(entity.Skus[1].ScorePrice, 200) - t.Assert(entity.Skus[1].MarketPrice, 288) + t.Assert(entity.Skus[1].Name, "blue") + t.Assert(entity.Skus[1].Stock, 100) + t.Assert(entity.Skus[1].GiftId, 2) + t.Assert(entity.Skus[1].CostPrice, 81) + t.Assert(entity.Skus[1].ScorePrice, 200) + t.Assert(entity.Skus[1].MarketPrice, 288) - t.Assert(entity.Id, 17) - t.Assert(entity.StoreId, 100004) - t.Assert(entity.GiftType, 1) - t.Assert(entity.GiftName, "GIFT") - t.Assert(entity.Description, "支持个性定制的父亲节老师长辈的专属礼物") - t.Assert(len(entity.Covers.List), 3) - t.Assert(entity.OutSn, "259402") - t.Assert(entity.LimitCustomerTags, "[]") - t.Assert(entity.ScorePrice, 10) - t.Assert(len(entity.Props), 1) - t.Assert(len(entity.Comments), 2) - t.Assert(entity.Status, 99) - t.Assert(entity.Content, `
礼品详情
`) - }) + t.Assert(entity.Id, 17) + t.Assert(entity.StoreId, 100004) + t.Assert(entity.GiftType, 1) + t.Assert(entity.GiftName, "GIFT") + t.Assert(entity.Description, "支持个性定制的父亲节老师长辈的专属礼物") + t.Assert(len(entity.Covers.List), 3) + t.Assert(entity.OutSn, "259402") + t.Assert(entity.LimitCustomerTags, "[]") + t.Assert(entity.ScorePrice, 10) + t.Assert(len(entity.Props), 1) + t.Assert(len(entity.Comments), 2) + t.Assert(entity.Status, 99) + t.Assert(entity.Content, `礼品详情
`) + }) } // https://github.com/gogf/gf/issues/1934 func Test_Issue1934(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Where(" id ", 1).One() - t.AssertNil(err) - t.Assert(one["id"], 1) - }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Where(" id ", 1).One() + t.AssertNil(err) + t.Assert(one["id"], 1) + }) } // https://github.com/gogf/gf/issues/1570 func Test_Issue1570(t *testing.T) { - var ( - tableUser = "user_" + gtime.TimestampMicroStr() - tableUserDetail = "user_detail_" + gtime.TimestampMicroStr() - tableUserScores = "user_scores_" + gtime.TimestampMicroStr() - ) - if _, err := db.Exec(ctx, fmt.Sprintf(` + var ( + tableUser = "user_" + gtime.TimestampMicroStr() + tableUserDetail = "user_detail_" + gtime.TimestampMicroStr() + tableUserScores = "user_scores_" + gtime.TimestampMicroStr() + ) + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( uid int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(45) NOT NULL, PRIMARY KEY (uid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, tableUser)); err != nil { - gtest.Error(err) - } - defer dropTable(tableUser) + gtest.Error(err) + } + defer dropTable(tableUser) - if _, err := db.Exec(ctx, fmt.Sprintf(` + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( uid int(10) unsigned NOT NULL AUTO_INCREMENT, address varchar(45) NOT NULL, PRIMARY KEY (uid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, tableUserDetail)); err != nil { - gtest.Error(err) - } - defer dropTable(tableUserDetail) + gtest.Error(err) + } + defer dropTable(tableUserDetail) - if _, err := db.Exec(ctx, fmt.Sprintf(` + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT, uid int(10) unsigned NOT NULL, @@ -188,279 +188,279 @@ CREATE TABLE %s ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, tableUserScores)); err != nil { - gtest.Error(err) - } - defer dropTable(tableUserScores) + gtest.Error(err) + } + defer dropTable(tableUserScores) - type EntityUser struct { - Uid int `json:"uid"` - Name string `json:"name"` - } - type EntityUserDetail struct { - Uid int `json:"uid"` - Address string `json:"address"` - } - type EntityUserScores struct { - Id int `json:"id"` - Uid int `json:"uid"` - Score int `json:"score"` - } - type Entity struct { - User *EntityUser - UserDetail *EntityUserDetail - UserScores []*EntityUserScores - } + type EntityUser struct { + Uid int `json:"uid"` + Name string `json:"name"` + } + type EntityUserDetail struct { + Uid int `json:"uid"` + Address string `json:"address"` + } + type EntityUserScores struct { + Id int `json:"id"` + Uid int `json:"uid"` + Score int `json:"score"` + } + type Entity struct { + User *EntityUser + UserDetail *EntityUserDetail + UserScores []*EntityUserScores + } - // Initialize the data. - gtest.C(t, func(t *gtest.T) { - var err error - for i := 1; i <= 5; i++ { - // User. - _, err = db.Insert(ctx, tableUser, g.Map{ - "uid": i, - "name": fmt.Sprintf(`name_%d`, i), - }) - t.AssertNil(err) - // Detail. - _, err = db.Insert(ctx, tableUserDetail, g.Map{ - "uid": i, - "address": fmt.Sprintf(`address_%d`, i), - }) - t.AssertNil(err) - // Scores. - for j := 1; j <= 5; j++ { - _, err = db.Insert(ctx, tableUserScores, g.Map{ - "uid": i, - "score": j, - }) - t.AssertNil(err) - } - } - }) + // Initialize the data. + gtest.C(t, func(t *gtest.T) { + var err error + for i := 1; i <= 5; i++ { + // User. + _, err = db.Insert(ctx, tableUser, g.Map{ + "uid": i, + "name": fmt.Sprintf(`name_%d`, i), + }) + t.AssertNil(err) + // Detail. + _, err = db.Insert(ctx, tableUserDetail, g.Map{ + "uid": i, + "address": fmt.Sprintf(`address_%d`, i), + }) + t.AssertNil(err) + // Scores. + for j := 1; j <= 5; j++ { + _, err = db.Insert(ctx, tableUserScores, g.Map{ + "uid": i, + "score": j, + }) + t.AssertNil(err) + } + } + }) - // Result ScanList with struct elements and pointer attributes. - gtest.C(t, func(t *gtest.T) { - var users []Entity - // User - err := db.Model(tableUser). - Where("uid", g.Slice{3, 4}). - Fields("uid"). - Order("uid asc"). - ScanList(&users, "User") - t.AssertNil(err) - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(users[0].User, &EntityUser{3, ""}) - t.Assert(users[1].User, &EntityUser{4, ""}) - // Detail - err = db.Model(tableUserDetail). - Where("uid", gdb.ListItemValues(users, "User", "Uid")). - Order("uid asc"). - ScanList(&users, "UserDetail", "User", "uid:Uid") - t.AssertNil(err) - t.AssertNil(err) - t.Assert(users[0].UserDetail, &EntityUserDetail{3, "address_3"}) - t.Assert(users[1].UserDetail, &EntityUserDetail{4, "address_4"}) - // Scores - err = db.Model(tableUserScores). - Where("uid", gdb.ListItemValues(users, "User", "Uid")). - Order("id asc"). - ScanList(&users, "UserScores", "User", "uid:Uid") - t.AssertNil(err) - t.AssertNil(err) - t.Assert(len(users[0].UserScores), 5) - t.Assert(len(users[1].UserScores), 5) - t.Assert(users[0].UserScores[0].Uid, 3) - t.Assert(users[0].UserScores[0].Score, 1) - t.Assert(users[0].UserScores[4].Score, 5) - t.Assert(users[1].UserScores[0].Uid, 4) - t.Assert(users[1].UserScores[0].Score, 1) - t.Assert(users[1].UserScores[4].Score, 5) - }) + // Result ScanList with struct elements and pointer attributes. + gtest.C(t, func(t *gtest.T) { + var users []Entity + // User + err := db.Model(tableUser). + Where("uid", g.Slice{3, 4}). + Fields("uid"). + Order("uid asc"). + ScanList(&users, "User") + t.AssertNil(err) + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(users[0].User, &EntityUser{3, ""}) + t.Assert(users[1].User, &EntityUser{4, ""}) + // Detail + err = db.Model(tableUserDetail). + Where("uid", gdb.ListItemValues(users, "User", "Uid")). + Order("uid asc"). + ScanList(&users, "UserDetail", "User", "uid:Uid") + t.AssertNil(err) + t.AssertNil(err) + t.Assert(users[0].UserDetail, &EntityUserDetail{3, "address_3"}) + t.Assert(users[1].UserDetail, &EntityUserDetail{4, "address_4"}) + // Scores + err = db.Model(tableUserScores). + Where("uid", gdb.ListItemValues(users, "User", "Uid")). + Order("id asc"). + ScanList(&users, "UserScores", "User", "uid:Uid") + t.AssertNil(err) + t.AssertNil(err) + t.Assert(len(users[0].UserScores), 5) + t.Assert(len(users[1].UserScores), 5) + t.Assert(users[0].UserScores[0].Uid, 3) + t.Assert(users[0].UserScores[0].Score, 1) + t.Assert(users[0].UserScores[4].Score, 5) + t.Assert(users[1].UserScores[0].Uid, 4) + t.Assert(users[1].UserScores[0].Score, 1) + t.Assert(users[1].UserScores[4].Score, 5) + }) } // https://github.com/gogf/gf/issues/1401 func Test_Issue1401(t *testing.T) { - var ( - table1 = "parcels" - table2 = "parcel_items" - ) - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `1401.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table1) - defer dropTable(table2) + var ( + table1 = "parcels" + table2 = "parcel_items" + ) + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `1401.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table1) + defer dropTable(table2) - gtest.C(t, func(t *gtest.T) { - type NItem struct { - Id int `json:"id"` - ParcelId int `json:"parcel_id"` - } + gtest.C(t, func(t *gtest.T) { + type NItem struct { + Id int `json:"id"` + ParcelId int `json:"parcel_id"` + } - type ParcelItem struct { - gmeta.Meta `orm:"table:parcel_items"` - NItem - } + type ParcelItem struct { + gmeta.Meta `orm:"table:parcel_items"` + NItem + } - type ParcelRsp struct { - gmeta.Meta `orm:"table:parcels"` - Id int `json:"id"` - Items []*ParcelItem `json:"items" orm:"with:parcel_id=Id"` - } + type ParcelRsp struct { + gmeta.Meta `orm:"table:parcels"` + Id int `json:"id"` + Items []*ParcelItem `json:"items" orm:"with:parcel_id=Id"` + } - parcelDetail := &ParcelRsp{} - err := db.Model(table1).With(parcelDetail.Items).Where("id", 3).Scan(&parcelDetail) - t.AssertNil(err) - t.Assert(parcelDetail.Id, 3) - t.Assert(len(parcelDetail.Items), 1) - t.Assert(parcelDetail.Items[0].Id, 2) - t.Assert(parcelDetail.Items[0].ParcelId, 3) - }) + parcelDetail := &ParcelRsp{} + err := db.Model(table1).With(parcelDetail.Items).Where("id", 3).Scan(&parcelDetail) + t.AssertNil(err) + t.Assert(parcelDetail.Id, 3) + t.Assert(len(parcelDetail.Items), 1) + t.Assert(parcelDetail.Items[0].Id, 2) + t.Assert(parcelDetail.Items[0].ParcelId, 3) + }) } // https://github.com/gogf/gf/issues/1412 func Test_Issue1412(t *testing.T) { - var ( - table1 = "parcels" - table2 = "items" - ) - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `1412.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table1) - defer dropTable(table2) + var ( + table1 = "parcels" + table2 = "items" + ) + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `1412.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table1) + defer dropTable(table2) - gtest.C(t, func(t *gtest.T) { - type Items struct { - gmeta.Meta `orm:"table:items"` - Id int `json:"id"` - Name string `json:"name"` - } + gtest.C(t, func(t *gtest.T) { + type Items struct { + gmeta.Meta `orm:"table:items"` + Id int `json:"id"` + Name string `json:"name"` + } - type ParcelRsp struct { - gmeta.Meta `orm:"table:parcels"` - Id int `json:"id"` - ItemId int `json:"item_id"` - Items Items `json:"items" orm:"with:Id=ItemId"` - } + type ParcelRsp struct { + gmeta.Meta `orm:"table:parcels"` + Id int `json:"id"` + ItemId int `json:"item_id"` + Items Items `json:"items" orm:"with:Id=ItemId"` + } - entity := &ParcelRsp{} - err := db.Model("parcels").With(Items{}).Where("id=3").Scan(&entity) - t.AssertNil(err) - t.Assert(entity.Id, 3) - t.Assert(entity.ItemId, 0) - t.Assert(entity.Items.Id, 0) - t.Assert(entity.Items.Name, "") - }) + entity := &ParcelRsp{} + err := db.Model("parcels").With(Items{}).Where("id=3").Scan(&entity) + t.AssertNil(err) + t.Assert(entity.Id, 3) + t.Assert(entity.ItemId, 0) + t.Assert(entity.Items.Id, 0) + t.Assert(entity.Items.Name, "") + }) - gtest.C(t, func(t *gtest.T) { - type Items struct { - gmeta.Meta `orm:"table:items"` - Id int `json:"id"` - Name string `json:"name"` - } + gtest.C(t, func(t *gtest.T) { + type Items struct { + gmeta.Meta `orm:"table:items"` + Id int `json:"id"` + Name string `json:"name"` + } - type ParcelRsp struct { - gmeta.Meta `orm:"table:parcels"` - Id int `json:"id"` - ItemId int `json:"item_id"` - Items Items `json:"items" orm:"with:Id=ItemId"` - } + type ParcelRsp struct { + gmeta.Meta `orm:"table:parcels"` + Id int `json:"id"` + ItemId int `json:"item_id"` + Items Items `json:"items" orm:"with:Id=ItemId"` + } - entity := &ParcelRsp{} - err := db.Model("parcels").With(Items{}).Where("id=30000").Scan(&entity) - t.AssertNE(err, nil) - t.Assert(entity.Id, 0) - t.Assert(entity.ItemId, 0) - t.Assert(entity.Items.Id, 0) - t.Assert(entity.Items.Name, "") - }) + entity := &ParcelRsp{} + err := db.Model("parcels").With(Items{}).Where("id=30000").Scan(&entity) + t.AssertNE(err, nil) + t.Assert(entity.Id, 0) + t.Assert(entity.ItemId, 0) + t.Assert(entity.Items.Id, 0) + t.Assert(entity.Items.Name, "") + }) } // https://github.com/gogf/gf/issues/1002 func Test_Issue1002(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - result, err := db.Model(table).Data(g.Map{ - "id": 1, - "passport": "port_1", - "password": "pass_1", - "nickname": "name_2", - "create_time": "2020-10-27 19:03:33", - }).Insert() - gtest.AssertNil(err) - n, _ := result.RowsAffected() - gtest.Assert(n, 1) + result, err := db.Model(table).Data(g.Map{ + "id": 1, + "passport": "port_1", + "password": "pass_1", + "nickname": "name_2", + "create_time": "2020-10-27 19:03:33", + }).Insert() + gtest.AssertNil(err) + n, _ := result.RowsAffected() + gtest.Assert(n, 1) - // where + string. - gtest.C(t, func(t *gtest.T) { - v, err := db.Model(table).Fields("id").Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").Value() - t.AssertNil(err) - t.Assert(v.Int(), 1) - }) - gtest.C(t, func(t *gtest.T) { - v, err := db.Model(table).Fields("id").Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").Value() - t.AssertNil(err) - t.Assert(v.Int(), 1) - }) - // where + string arguments. - gtest.C(t, func(t *gtest.T) { - v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", "2020-10-27 19:03:32", "2020-10-27 19:03:34").Value() - t.AssertNil(err) - t.Assert(v.Int(), 1) - }) - // where + gtime.Time arguments. - gtest.C(t, func(t *gtest.T) { - v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", gtime.New("2020-10-27 19:03:32"), gtime.New("2020-10-27 19:03:34")).Value() - t.AssertNil(err) - t.Assert(v.Int(), 1) - }) - // where + time.Time arguments, UTC. - gtest.C(t, func(t *gtest.T) { - t1, _ := time.Parse("2006-01-02 15:04:05", "2020-10-27 11:03:32") - t2, _ := time.Parse("2006-01-02 15:04:05", "2020-10-27 11:03:34") - { - v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", t1, t2).Value() - t.AssertNil(err) - t.Assert(v.Int(), 1) - } - }) - // where + time.Time arguments, +8. - // gtest.C(t, func(t *gtest.T) { - // // Change current timezone to +8 zone. - // location, err := time.LoadLocation("Asia/Shanghai") - // t.AssertNil(err) - // t1, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-10-27 19:03:32", location) - // t2, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-10-27 19:03:34", location) - // { - // v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", t1, t2).Value() - // t.AssertNil(err) - // t.Assert(v.Int(), 1) - // } - // { - // v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", t1, t2).FindValue() - // t.AssertNil(err) - // t.Assert(v.Int(), 1) - // } - // { - // v, err := db.Model(table).Where("create_time>? and create_time", t1, t2).FindValue("id") - // t.AssertNil(err) - // t.Assert(v.Int(), 1) - // } - // }) + // where + string. + gtest.C(t, func(t *gtest.T) { + v, err := db.Model(table).Fields("id").Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").Value() + t.AssertNil(err) + t.Assert(v.Int(), 1) + }) + gtest.C(t, func(t *gtest.T) { + v, err := db.Model(table).Fields("id").Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").Value() + t.AssertNil(err) + t.Assert(v.Int(), 1) + }) + // where + string arguments. + gtest.C(t, func(t *gtest.T) { + v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", "2020-10-27 19:03:32", "2020-10-27 19:03:34").Value() + t.AssertNil(err) + t.Assert(v.Int(), 1) + }) + // where + gtime.Time arguments. + gtest.C(t, func(t *gtest.T) { + v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", gtime.New("2020-10-27 19:03:32"), gtime.New("2020-10-27 19:03:34")).Value() + t.AssertNil(err) + t.Assert(v.Int(), 1) + }) + // where + time.Time arguments, UTC. + gtest.C(t, func(t *gtest.T) { + t1, _ := time.Parse("2006-01-02 15:04:05", "2020-10-27 11:03:32") + t2, _ := time.Parse("2006-01-02 15:04:05", "2020-10-27 11:03:34") + { + v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", t1, t2).Value() + t.AssertNil(err) + t.Assert(v.Int(), 1) + } + }) + // where + time.Time arguments, +8. + // gtest.C(t, func(t *gtest.T) { + // // Change current timezone to +8 zone. + // location, err := time.LoadLocation("Asia/Shanghai") + // t.AssertNil(err) + // t1, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-10-27 19:03:32", location) + // t2, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-10-27 19:03:34", location) + // { + // v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", t1, t2).Value() + // t.AssertNil(err) + // t.Assert(v.Int(), 1) + // } + // { + // v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", t1, t2).FindValue() + // t.AssertNil(err) + // t.Assert(v.Int(), 1) + // } + // { + // v, err := db.Model(table).Where("create_time>? and create_time", t1, t2).FindValue("id") + // t.AssertNil(err) + // t.Assert(v.Int(), 1) + // } + // }) } // https://github.com/gogf/gf/issues/1700 func Test_Issue1700(t *testing.T) { - table := "user_" + gtime.Now().TimestampNanoStr() - if _, err := db.Exec(ctx, fmt.Sprintf(` + table := "user_" + gtime.Now().TimestampNanoStr() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT, user_id int(10) unsigned NOT NULL, @@ -468,224 +468,224 @@ func Test_Issue1700(t *testing.T) { PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table, - )); err != nil { - gtest.AssertNil(err) - } - defer dropTable(table) + )); err != nil { + gtest.AssertNil(err) + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int `orm:"id"` - Userid int `orm:"user_id"` - UserId int `orm:"UserId"` - } - _, err := db.Model(table).Data(User{ - Id: 1, - Userid: 2, - UserId: 3, - }).Insert() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int `orm:"id"` + Userid int `orm:"user_id"` + UserId int `orm:"UserId"` + } + _, err := db.Model(table).Data(User{ + Id: 1, + Userid: 2, + UserId: 3, + }).Insert() + t.AssertNil(err) - one, err := db.Model(table).One() - t.AssertNil(err) - t.Assert(one, g.Map{ - "id": 1, - "user_id": 2, - "UserId": 3, - }) + one, err := db.Model(table).One() + t.AssertNil(err) + t.Assert(one, g.Map{ + "id": 1, + "user_id": 2, + "UserId": 3, + }) - for i := 0; i < 1000; i++ { - var user *User - err = db.Model(table).Scan(&user) - t.AssertNil(err) - t.Assert(user.Id, 1) - t.Assert(user.Userid, 2) - t.Assert(user.UserId, 3) - } - }) + for i := 0; i < 1000; i++ { + var user *User + err = db.Model(table).Scan(&user) + t.AssertNil(err) + t.Assert(user.Id, 1) + t.Assert(user.Userid, 2) + t.Assert(user.UserId, 3) + } + }) } // https://github.com/gogf/gf/issues/1701 func Test_Issue1701(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Fields(gdb.Raw("if(id=1,100,null)")).WherePri(1).Value() - t.AssertNil(err) - t.Assert(value.String(), 100) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Fields(gdb.Raw("if(id=1,100,null)")).WherePri(1).Value() + t.AssertNil(err) + t.Assert(value.String(), 100) + }) } // https://github.com/gogf/gf/issues/1733 func Test_Issue1733(t *testing.T) { - table := "user_" + guid.S() - if _, err := db.Exec(ctx, fmt.Sprintf(` + table := "user_" + guid.S() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(8) unsigned zerofill NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table, - )); err != nil { - gtest.AssertNil(err) - } - defer dropTable(table) + )); err != nil { + gtest.AssertNil(err) + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - for i := 1; i <= 10; i++ { - _, err := db.Model(table).Data(g.Map{ - "id": i, - }).Insert() - t.AssertNil(err) - } + gtest.C(t, func(t *gtest.T) { + for i := 1; i <= 10; i++ { + _, err := db.Model(table).Data(g.Map{ + "id": i, + }).Insert() + t.AssertNil(err) + } - all, err := db.Model(table).OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all), 10) - for i := 0; i < 10; i++ { - t.Assert(all[i]["id"].Int(), i+1) - } - }) + all, err := db.Model(table).OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all), 10) + for i := 0; i < 10; i++ { + t.Assert(all[i]["id"].Int(), i+1) + } + }) } // https://github.com/gogf/gf/issues/2012 func Test_Issue2012(t *testing.T) { - table := "time_only_" + guid.S() - if _, err := db.Exec(ctx, fmt.Sprintf(` + table := "time_only_" + guid.S() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s( id int(8) unsigned zerofill NOT NULL AUTO_INCREMENT, time_only time, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table, - )); err != nil { - gtest.AssertNil(err) - } - defer dropTable(table) + )); err != nil { + gtest.AssertNil(err) + } + defer dropTable(table) - type TimeOnly struct { - Id int `json:"id"` - TimeOnly *gtime.Time `json:"timeOnly"` - } + type TimeOnly struct { + Id int `json:"id"` + TimeOnly *gtime.Time `json:"timeOnly"` + } - gtest.C(t, func(t *gtest.T) { - timeOnly := gtime.New("15:04:05") - m := db.Model(table) + gtest.C(t, func(t *gtest.T) { + timeOnly := gtime.New("15:04:05") + m := db.Model(table) - _, err := m.Insert(TimeOnly{ - TimeOnly: gtime.New(timeOnly), - }) - t.AssertNil(err) + _, err := m.Insert(TimeOnly{ + TimeOnly: gtime.New(timeOnly), + }) + t.AssertNil(err) - _, err = m.Insert(g.Map{ - "time_only": timeOnly, - }) - t.AssertNil(err) + _, err = m.Insert(g.Map{ + "time_only": timeOnly, + }) + t.AssertNil(err) - _, err = m.Insert("time_only", timeOnly) - t.AssertNil(err) - }) + _, err = m.Insert("time_only", timeOnly) + t.AssertNil(err) + }) } // https://github.com/gogf/gf/issues/2105 func Test_Issue2105(t *testing.T) { - table := "issue2105" - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `2105.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) + table := "issue2105" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `2105.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) - type JsonItem struct { - Name string `json:"name,omitempty"` - Value string `json:"value,omitempty"` - } - type Test struct { - Id string `json:"id,omitempty"` - Json []*JsonItem `json:"json,omitempty"` - } + type JsonItem struct { + Name string `json:"name,omitempty"` + Value string `json:"value,omitempty"` + } + type Test struct { + Id string `json:"id,omitempty"` + Json []*JsonItem `json:"json,omitempty"` + } - gtest.C(t, func(t *gtest.T) { - var list []*Test - err := db.Model(table).Scan(&list) - t.AssertNil(err) - t.Assert(len(list), 2) - t.Assert(len(list[0].Json), 0) - t.Assert(len(list[1].Json), 3) - }) + gtest.C(t, func(t *gtest.T) { + var list []*Test + err := db.Model(table).Scan(&list) + t.AssertNil(err) + t.Assert(len(list), 2) + t.Assert(len(list[0].Json), 0) + t.Assert(len(list[1].Json), 3) + }) } // https://github.com/gogf/gf/issues/2231 func Test_Issue2231(t *testing.T) { - var ( - pattern = `(\w+):([\w\-]*):(.*?)@(\w+?)\((.+?)\)/{0,1}([^\?]*)\?{0,1}(.*)` - link = `mysql:root:12345678@tcp(127.0.0.1:3306)/a正bc式?loc=Local&parseTime=true` - ) - gtest.C(t, func(t *gtest.T) { - match, err := gregex.MatchString(pattern, link) - t.AssertNil(err) - t.Assert(match[1], "mysql") - t.Assert(match[2], "root") - t.Assert(match[3], "12345678") - t.Assert(match[4], "tcp") - t.Assert(match[5], "127.0.0.1:3306") - t.Assert(match[6], "a正bc式") - t.Assert(match[7], "loc=Local&parseTime=true") - }) + var ( + pattern = `(\w+):([\w\-]*):(.*?)@(\w+?)\((.+?)\)/{0,1}([^\?]*)\?{0,1}(.*)` + link = `mysql:root:12345678@tcp(127.0.0.1:3306)/a正bc式?loc=Local&parseTime=true` + ) + gtest.C(t, func(t *gtest.T) { + match, err := gregex.MatchString(pattern, link) + t.AssertNil(err) + t.Assert(match[1], "mysql") + t.Assert(match[2], "root") + t.Assert(match[3], "12345678") + t.Assert(match[4], "tcp") + t.Assert(match[5], "127.0.0.1:3306") + t.Assert(match[6], "a正bc式") + t.Assert(match[7], "loc=Local&parseTime=true") + }) } // https://github.com/gogf/gf/issues/2339 func Test_Issue2339(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - model1 := db.Model(table, "u1").Where("id between ? and ?", 1, 9) - model2 := db.Model("? as u2", model1) - model3 := db.Model("? as u3", model2) - all2, err := model2.WhereGT("id", 6).OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all2), 3) - t.Assert(all2[0]["id"], 7) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + model1 := db.Model(table, "u1").Where("id between ? and ?", 1, 9) + model2 := db.Model("? as u2", model1) + model3 := db.Model("? as u3", model2) + all2, err := model2.WhereGT("id", 6).OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all2), 3) + t.Assert(all2[0]["id"], 7) - all3, err := model3.WhereGT("id", 7).OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all3), 2) - t.Assert(all3[0]["id"], 8) - }) + all3, err := model3.WhereGT("id", 7).OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all3), 2) + t.Assert(all3[0]["id"], 8) + }) } // https://github.com/gogf/gf/issues/2356 func Test_Issue2356(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table := "demo_" + guid.S() - if _, err := db.Exec(ctx, fmt.Sprintf(` + gtest.C(t, func(t *gtest.T) { + table := "demo_" + guid.S() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id BIGINT(20) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table, - )); err != nil { - t.AssertNil(err) - } - defer dropTable(table) + )); err != nil { + t.AssertNil(err) + } + defer dropTable(table) - if _, err := db.Exec(ctx, fmt.Sprintf(`INSERT INTO %s (id) VALUES (18446744073709551615);`, table)); err != nil { - t.AssertNil(err) - } + if _, err := db.Exec(ctx, fmt.Sprintf(`INSERT INTO %s (id) VALUES (18446744073709551615);`, table)); err != nil { + t.AssertNil(err) + } - one, err := db.Model(table).One() - t.AssertNil(err) - t.AssertEQ(one["id"].Val(), uint64(18446744073709551615)) - }) + one, err := db.Model(table).One() + t.AssertNil(err) + t.AssertEQ(one["id"].Val(), uint64(18446744073709551615)) + }) } // https://github.com/gogf/gf/issues/2338 func Test_Issue2338(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table1 := "demo_" + guid.S() - table2 := "demo_" + guid.S() - if _, err := db.Schema(TestSchema1).Exec(ctx, fmt.Sprintf(` + gtest.C(t, func(t *gtest.T) { + table1 := "demo_" + guid.S() + table2 := "demo_" + guid.S() + if _, err := db.Schema(TestSchema1).Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'User ID', nickname varchar(45) DEFAULT NULL COMMENT 'User Nickname', @@ -694,10 +694,10 @@ CREATE TABLE %s ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table1, - )); err != nil { - t.AssertNil(err) - } - if _, err := db.Schema(TestSchema2).Exec(ctx, fmt.Sprintf(` + )); err != nil { + t.AssertNil(err) + } + if _, err := db.Schema(TestSchema2).Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'User ID', nickname varchar(45) DEFAULT NULL COMMENT 'User Nickname', @@ -706,39 +706,39 @@ CREATE TABLE %s ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table2, - )); err != nil { - t.AssertNil(err) - } - defer dropTableWithDb(db.Schema(TestSchema1), table1) - defer dropTableWithDb(db.Schema(TestSchema2), table2) + )); err != nil { + t.AssertNil(err) + } + defer dropTableWithDb(db.Schema(TestSchema1), table1) + defer dropTableWithDb(db.Schema(TestSchema2), table2) - var err error - _, err = db.Schema(TestSchema1).Model(table1).Insert(g.Map{ - "id": 1, - "nickname": "name_1", - }) - t.AssertNil(err) + var err error + _, err = db.Schema(TestSchema1).Model(table1).Insert(g.Map{ + "id": 1, + "nickname": "name_1", + }) + t.AssertNil(err) - _, err = db.Schema(TestSchema2).Model(table2).Insert(g.Map{ - "id": 1, - "nickname": "name_2", - }) - t.AssertNil(err) + _, err = db.Schema(TestSchema2).Model(table2).Insert(g.Map{ + "id": 1, + "nickname": "name_2", + }) + t.AssertNil(err) - tableName1 := fmt.Sprintf(`%s.%s`, TestSchema1, table1) - tableName2 := fmt.Sprintf(`%s.%s`, TestSchema2, table2) - all, err := db.Model(tableName1).As(`a`). - LeftJoin(tableName2+" b", `a.id=b.id`). - Fields(`a.id`, `b.nickname`).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["nickname"], "name_2") - }) + tableName1 := fmt.Sprintf(`%s.%s`, TestSchema1, table1) + tableName2 := fmt.Sprintf(`%s.%s`, TestSchema2, table2) + all, err := db.Model(tableName1).As(`a`). + LeftJoin(tableName2+" b", `a.id=b.id`). + Fields(`a.id`, `b.nickname`).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["nickname"], "name_2") + }) - gtest.C(t, func(t *gtest.T) { - table1 := "demo_" + guid.S() - table2 := "demo_" + guid.S() - if _, err := db.Schema(TestSchema1).Exec(ctx, fmt.Sprintf(` + gtest.C(t, func(t *gtest.T) { + table1 := "demo_" + guid.S() + table2 := "demo_" + guid.S() + if _, err := db.Schema(TestSchema1).Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'User ID', nickname varchar(45) DEFAULT NULL COMMENT 'User Nickname', @@ -748,10 +748,10 @@ CREATE TABLE %s ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table1, - )); err != nil { - t.AssertNil(err) - } - if _, err := db.Schema(TestSchema2).Exec(ctx, fmt.Sprintf(` + )); err != nil { + t.AssertNil(err) + } + if _, err := db.Schema(TestSchema2).Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'User ID', nickname varchar(45) DEFAULT NULL COMMENT 'User Nickname', @@ -761,41 +761,41 @@ CREATE TABLE %s ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table2, - )); err != nil { - t.AssertNil(err) - } - defer dropTableWithDb(db.Schema(TestSchema1), table1) - defer dropTableWithDb(db.Schema(TestSchema2), table2) + )); err != nil { + t.AssertNil(err) + } + defer dropTableWithDb(db.Schema(TestSchema1), table1) + defer dropTableWithDb(db.Schema(TestSchema2), table2) - var err error - _, err = db.Schema(TestSchema1).Model(table1).Insert(g.Map{ - "id": 1, - "nickname": "name_1", - }) - t.AssertNil(err) + var err error + _, err = db.Schema(TestSchema1).Model(table1).Insert(g.Map{ + "id": 1, + "nickname": "name_1", + }) + t.AssertNil(err) - _, err = db.Schema(TestSchema2).Model(table2).Insert(g.Map{ - "id": 1, - "nickname": "name_2", - }) - t.AssertNil(err) + _, err = db.Schema(TestSchema2).Model(table2).Insert(g.Map{ + "id": 1, + "nickname": "name_2", + }) + t.AssertNil(err) - tableName1 := fmt.Sprintf(`%s.%s`, TestSchema1, table1) - tableName2 := fmt.Sprintf(`%s.%s`, TestSchema2, table2) - all, err := db.Model(tableName1).As(`a`). - LeftJoin(tableName2+" b", `a.id=b.id`). - Fields(`a.id`, `b.nickname`).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["nickname"], "name_2") - }) + tableName1 := fmt.Sprintf(`%s.%s`, TestSchema1, table1) + tableName2 := fmt.Sprintf(`%s.%s`, TestSchema2, table2) + all, err := db.Model(tableName1).As(`a`). + LeftJoin(tableName2+" b", `a.id=b.id`). + Fields(`a.id`, `b.nickname`).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["nickname"], "name_2") + }) } // https://github.com/gogf/gf/issues/2427 func Test_Issue2427(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table := "demo_" + guid.S() - if _, err := db.Exec(ctx, fmt.Sprintf(` + gtest.C(t, func(t *gtest.T) { + table := "demo_" + guid.S() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'User ID', passport varchar(45) NOT NULL COMMENT 'User Passport', @@ -806,1010 +806,1010 @@ CREATE TABLE %s ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table, - )); err != nil { - t.AssertNil(err) - } - defer dropTable(table) + )); err != nil { + t.AssertNil(err) + } + defer dropTable(table) - _, err1 := db.Model(table).Delete() - t.Assert(err1, `there should be WHERE condition statement for DELETE operation`) + _, err1 := db.Model(table).Delete() + t.Assert(err1, `there should be WHERE condition statement for DELETE operation`) - _, err2 := db.Model(table).Where(g.Map{}).Delete() - t.Assert(err2, `there should be WHERE condition statement for DELETE operation`) + _, err2 := db.Model(table).Where(g.Map{}).Delete() + t.Assert(err2, `there should be WHERE condition statement for DELETE operation`) - _, err3 := db.Model(table).Where(1).Delete() - t.AssertNil(err3) - }) + _, err3 := db.Model(table).Where(1).Delete() + t.AssertNil(err3) + }) } // https://github.com/gogf/gf/issues/2561 func Test_Issue2561(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - g.Meta `orm:"do:true"` - Id interface{} - Passport interface{} - Password interface{} - Nickname interface{} - CreateTime interface{} - } - data := g.Slice{ - User{ - Id: 1, - Passport: "user_1", - }, - User{ - Id: 2, - Password: "pass_2", - }, - User{ - Id: 3, - Password: "pass_3", - }, - } - result, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) - m, _ := result.LastInsertId() - t.Assert(m, 3) + gtest.C(t, func(t *gtest.T) { + type User struct { + g.Meta `orm:"do:true"` + Id interface{} + Passport interface{} + Password interface{} + Nickname interface{} + CreateTime interface{} + } + data := g.Slice{ + User{ + Id: 1, + Passport: "user_1", + }, + User{ + Id: 2, + Password: "pass_2", + }, + User{ + Id: 3, + Password: "pass_3", + }, + } + result, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) + m, _ := result.LastInsertId() + t.Assert(m, 3) - n, _ := result.RowsAffected() - t.Assert(n, 3) + n, _ := result.RowsAffected() + t.Assert(n, 3) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one[`id`], `1`) - t.Assert(one[`passport`], `user_1`) - t.Assert(one[`password`], ``) - t.Assert(one[`nickname`], ``) - t.Assert(one[`create_time`], ``) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one[`id`], `1`) + t.Assert(one[`passport`], `user_1`) + t.Assert(one[`password`], ``) + t.Assert(one[`nickname`], ``) + t.Assert(one[`create_time`], ``) - one, err = db.Model(table).WherePri(2).One() - t.AssertNil(err) - t.Assert(one[`id`], `2`) - t.Assert(one[`passport`], ``) - t.Assert(one[`password`], `pass_2`) - t.Assert(one[`nickname`], ``) - t.Assert(one[`create_time`], ``) + one, err = db.Model(table).WherePri(2).One() + t.AssertNil(err) + t.Assert(one[`id`], `2`) + t.Assert(one[`passport`], ``) + t.Assert(one[`password`], `pass_2`) + t.Assert(one[`nickname`], ``) + t.Assert(one[`create_time`], ``) - one, err = db.Model(table).WherePri(3).One() - t.AssertNil(err) - t.Assert(one[`id`], `3`) - t.Assert(one[`passport`], ``) - t.Assert(one[`password`], `pass_3`) - t.Assert(one[`nickname`], ``) - t.Assert(one[`create_time`], ``) - }) + one, err = db.Model(table).WherePri(3).One() + t.AssertNil(err) + t.Assert(one[`id`], `3`) + t.Assert(one[`passport`], ``) + t.Assert(one[`password`], `pass_3`) + t.Assert(one[`nickname`], ``) + t.Assert(one[`create_time`], ``) + }) } // https://github.com/gogf/gf/issues/2439 func Test_Issue2439(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `2439.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable("a") - defer dropTable("b") - defer dropTable("c") + gtest.C(t, func(t *gtest.T) { + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `2439.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable("a") + defer dropTable("b") + defer dropTable("c") - orm := db.Model("a") - orm = orm.InnerJoin( - "c", "a.id=c.id", - ) - orm = orm.InnerJoinOnField("b", "id") - whereFormat := fmt.Sprintf( - "(`%s`.`%s` LIKE ?) ", - "b", "name", - ) - orm = orm.WhereOrf( - whereFormat, - "%a%", - ) - r, err := orm.All() - t.AssertNil(err) - t.Assert(len(r), 1) - t.Assert(r[0]["id"], 2) - t.Assert(r[0]["name"], "a") - }) + orm := db.Model("a") + orm = orm.InnerJoin( + "c", "a.id=c.id", + ) + orm = orm.InnerJoinOnField("b", "id") + whereFormat := fmt.Sprintf( + "(`%s`.`%s` LIKE ?) ", + "b", "name", + ) + orm = orm.WhereOrf( + whereFormat, + "%a%", + ) + r, err := orm.All() + t.AssertNil(err) + t.Assert(len(r), 1) + t.Assert(r[0]["id"], 2) + t.Assert(r[0]["name"], "a") + }) } // https://github.com/gogf/gf/issues/2782 func Test_Issue2787(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - m := db.Model("user") + gtest.C(t, func(t *gtest.T) { + m := db.Model("user") - condWhere, _ := m.Builder(). - Where("id", ""). - Where(m.Builder(). - Where("nickname", "foo"). - WhereOr("password", "abc123")). - Where("passport", "pp"). - Build() - t.Assert(condWhere, "(`id`=?) AND (((`nickname`=?) OR (`password`=?))) AND (`passport`=?)") + condWhere, _ := m.Builder(). + Where("id", ""). + Where(m.Builder(). + Where("nickname", "foo"). + WhereOr("password", "abc123")). + Where("passport", "pp"). + Build() + t.Assert(condWhere, "(`id`=?) AND (((`nickname`=?) OR (`password`=?))) AND (`passport`=?)") - condWhere, _ = m.OmitEmpty().Builder(). - Where("id", ""). - Where(m.Builder(). - Where("nickname", "foo"). - WhereOr("password", "abc123")). - Where("passport", "pp"). - Build() - t.Assert(condWhere, "((`nickname`=?) OR (`password`=?)) AND (`passport`=?)") + condWhere, _ = m.OmitEmpty().Builder(). + Where("id", ""). + Where(m.Builder(). + Where("nickname", "foo"). + WhereOr("password", "abc123")). + Where("passport", "pp"). + Build() + t.Assert(condWhere, "((`nickname`=?) OR (`password`=?)) AND (`passport`=?)") - condWhere, _ = m.OmitEmpty().Builder(). - Where(m.Builder(). - Where("nickname", "foo"). - WhereOr("password", "abc123")). - Where("id", ""). - Where("passport", "pp"). - Build() - t.Assert(condWhere, "((`nickname`=?) OR (`password`=?)) AND (`passport`=?)") - }) + condWhere, _ = m.OmitEmpty().Builder(). + Where(m.Builder(). + Where("nickname", "foo"). + WhereOr("password", "abc123")). + Where("id", ""). + Where("passport", "pp"). + Build() + t.Assert(condWhere, "((`nickname`=?) OR (`password`=?)) AND (`passport`=?)") + }) } // https://github.com/gogf/gf/issues/2907 func Test_Issue2907(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - var ( - orm = db.Model(table) - err error - ) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + var ( + orm = db.Model(table) + err error + ) - orm = orm.WherePrefixNotIn( - table, - "id", - []int{ - 1, - 2, - }, - ) - all, err := orm.OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all), TableSize-2) - t.Assert(all[0]["id"], 3) - }) + orm = orm.WherePrefixNotIn( + table, + "id", + []int{ + 1, + 2, + }, + ) + all, err := orm.OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all), TableSize-2) + t.Assert(all[0]["id"], 3) + }) } // https://github.com/gogf/gf/issues/3086 func Test_Issue3086(t *testing.T) { - table := "issue3086_user" - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3086.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - g.Meta `orm:"do:true"` - Id interface{} - Passport interface{} - Password interface{} - Nickname interface{} - CreateTime interface{} - } - data := g.Slice{ - User{ - Id: nil, - Passport: "user_1", - }, - User{ - Id: 2, - Passport: "user_2", - }, - } - _, err := db.Model(table).Data(data).Batch(10).Insert() - t.AssertNE(err, nil) - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - g.Meta `orm:"do:true"` - Id interface{} - Passport interface{} - Password interface{} - Nickname interface{} - CreateTime interface{} - } - data := g.Slice{ - User{ - Id: 1, - Passport: "user_1", - }, - User{ - Id: 2, - Passport: "user_2", - }, - } - result, err := db.Model(table).Data(data).Batch(10).Insert() - t.AssertNil(err) - n, err := result.RowsAffected() - t.AssertNil(err) - t.Assert(n, 2) - }) + table := "issue3086_user" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3086.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type User struct { + g.Meta `orm:"do:true"` + Id interface{} + Passport interface{} + Password interface{} + Nickname interface{} + CreateTime interface{} + } + data := g.Slice{ + User{ + Id: nil, + Passport: "user_1", + }, + User{ + Id: 2, + Passport: "user_2", + }, + } + _, err := db.Model(table).Data(data).Batch(10).Insert() + t.AssertNE(err, nil) + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + g.Meta `orm:"do:true"` + Id interface{} + Passport interface{} + Password interface{} + Nickname interface{} + CreateTime interface{} + } + data := g.Slice{ + User{ + Id: 1, + Passport: "user_1", + }, + User{ + Id: 2, + Passport: "user_2", + }, + } + result, err := db.Model(table).Data(data).Batch(10).Insert() + t.AssertNil(err) + n, err := result.RowsAffected() + t.AssertNil(err) + t.Assert(n, 2) + }) } // https://github.com/gogf/gf/issues/3204 func Test_Issue3204(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - // where - gtest.C(t, func(t *gtest.T) { - type User struct { - g.Meta `orm:"do:true"` - Id interface{} `orm:"id,omitempty"` - Passport interface{} `orm:"passport,omitempty"` - Password interface{} `orm:"password,omitempty"` - Nickname interface{} `orm:"nickname,omitempty"` - CreateTime interface{} `orm:"create_time,omitempty"` - } - where := User{ - Id: 2, - Passport: "", - } - all, err := db.Model(table).Where(where).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 2) - }) - // data - gtest.C(t, func(t *gtest.T) { - type User struct { - g.Meta `orm:"do:true"` - Id interface{} `orm:"id,omitempty"` - Passport interface{} `orm:"passport,omitempty"` - Password interface{} `orm:"password,omitempty"` - Nickname interface{} `orm:"nickname,omitempty"` - CreateTime interface{} `orm:"create_time,omitempty"` - } - var ( - err error - sqlArray []string - insertId int64 - data = User{ - Id: 20, - Passport: "passport_20", - Password: "", - } - ) - sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { - insertId, err = db.Ctx(ctx).Model(table).Data(data).InsertAndGetId() - return err - }) - t.AssertNil(err) - t.Assert(insertId, 20) - t.Assert( - gstr.Contains(sqlArray[len(sqlArray)-1], "(`id`,`passport`) VALUES(20,'passport_20')"), - true, - ) - }) - // update data - gtest.C(t, func(t *gtest.T) { - type User struct { - g.Meta `orm:"do:true"` - Id interface{} `orm:"id,omitempty"` - Passport interface{} `orm:"passport,omitempty"` - Password interface{} `orm:"password,omitempty"` - Nickname interface{} `orm:"nickname,omitempty"` - CreateTime interface{} `orm:"create_time,omitempty"` - } - var ( - err error - sqlArray []string - data = User{ - Passport: "passport_1", - Password: "", - Nickname: "", - } - ) - sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { - _, err = db.Ctx(ctx).Model(table).Data(data).WherePri(1).Update() - return err - }) - t.AssertNil(err) - t.Assert( - gstr.Contains(sqlArray[len(sqlArray)-1], "SET `passport`='passport_1' WHERE `id`=1"), - true, - ) - }) + // where + gtest.C(t, func(t *gtest.T) { + type User struct { + g.Meta `orm:"do:true"` + Id interface{} `orm:"id,omitempty"` + Passport interface{} `orm:"passport,omitempty"` + Password interface{} `orm:"password,omitempty"` + Nickname interface{} `orm:"nickname,omitempty"` + CreateTime interface{} `orm:"create_time,omitempty"` + } + where := User{ + Id: 2, + Passport: "", + } + all, err := db.Model(table).Where(where).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 2) + }) + // data + gtest.C(t, func(t *gtest.T) { + type User struct { + g.Meta `orm:"do:true"` + Id interface{} `orm:"id,omitempty"` + Passport interface{} `orm:"passport,omitempty"` + Password interface{} `orm:"password,omitempty"` + Nickname interface{} `orm:"nickname,omitempty"` + CreateTime interface{} `orm:"create_time,omitempty"` + } + var ( + err error + sqlArray []string + insertId int64 + data = User{ + Id: 20, + Passport: "passport_20", + Password: "", + } + ) + sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { + insertId, err = db.Ctx(ctx).Model(table).Data(data).InsertAndGetId() + return err + }) + t.AssertNil(err) + t.Assert(insertId, 20) + t.Assert( + gstr.Contains(sqlArray[len(sqlArray)-1], "(`id`,`passport`) VALUES(20,'passport_20')"), + true, + ) + }) + // update data + gtest.C(t, func(t *gtest.T) { + type User struct { + g.Meta `orm:"do:true"` + Id interface{} `orm:"id,omitempty"` + Passport interface{} `orm:"passport,omitempty"` + Password interface{} `orm:"password,omitempty"` + Nickname interface{} `orm:"nickname,omitempty"` + CreateTime interface{} `orm:"create_time,omitempty"` + } + var ( + err error + sqlArray []string + data = User{ + Passport: "passport_1", + Password: "", + Nickname: "", + } + ) + sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { + _, err = db.Ctx(ctx).Model(table).Data(data).WherePri(1).Update() + return err + }) + t.AssertNil(err) + t.Assert( + gstr.Contains(sqlArray[len(sqlArray)-1], "SET `passport`='passport_1' WHERE `id`=1"), + true, + ) + }) } // https://github.com/gogf/gf/issues/3218 func Test_Issue3218(t *testing.T) { - table := "issue3218_sys_config" - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3218.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type SysConfigInfo struct { - Name string `json:"name"` - Value map[string]string `json:"value"` - } - var configData *SysConfigInfo - err := db.Model(table).Scan(&configData) - t.AssertNil(err) - t.Assert(configData, &SysConfigInfo{ - Name: "site", - Value: map[string]string{ - "fixed_page": "", - "site_name": "22", - "version": "22", - "banned_ip": "22", - "filings": "2222", - }, - }) - }) + table := "issue3218_sys_config" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3218.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type SysConfigInfo struct { + Name string `json:"name"` + Value map[string]string `json:"value"` + } + var configData *SysConfigInfo + err := db.Model(table).Scan(&configData) + t.AssertNil(err) + t.Assert(configData, &SysConfigInfo{ + Name: "site", + Value: map[string]string{ + "fixed_page": "", + "site_name": "22", + "version": "22", + "banned_ip": "22", + "filings": "2222", + }, + }) + }) } // https://github.com/gogf/gf/issues/2552 func Test_Issue2552_ClearTableFieldsAll(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - showTableKey := `SHOW FULL COLUMNS FROM` - gtest.C(t, func(t *gtest.T) { - ctx := context.Background() - sqlArray, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { - _, err := db.Model(table).Ctx(ctx).Insert(g.Map{ - "passport": guid.S(), - "password": guid.S(), - "nickname": guid.S(), - "create_time": gtime.NewFromStr(CreateTime).String(), - }) - return err - }) - t.AssertNil(err) - t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) + showTableKey := `SHOW FULL COLUMNS FROM` + gtest.C(t, func(t *gtest.T) { + ctx := context.Background() + sqlArray, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { + _, err := db.Model(table).Ctx(ctx).Insert(g.Map{ + "passport": guid.S(), + "password": guid.S(), + "nickname": guid.S(), + "create_time": gtime.NewFromStr(CreateTime).String(), + }) + return err + }) + t.AssertNil(err) + t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) - ctx = context.Background() - sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { - one, err := db.Model(table).Ctx(ctx).One() - t.Assert(len(one), 6) - return err - }) - t.AssertNil(err) - t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), false) + ctx = context.Background() + sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { + one, err := db.Model(table).Ctx(ctx).One() + t.Assert(len(one), 6) + return err + }) + t.AssertNil(err) + t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), false) - _, err = db.Exec(ctx, fmt.Sprintf("alter table %s drop column `nickname`", table)) - t.AssertNil(err) + _, err = db.Exec(ctx, fmt.Sprintf("alter table %s drop column `nickname`", table)) + t.AssertNil(err) - err = db.GetCore().ClearTableFieldsAll(ctx) - t.AssertNil(err) + err = db.GetCore().ClearTableFieldsAll(ctx) + t.AssertNil(err) - ctx = context.Background() - sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { - one, err := db.Model(table).Ctx(ctx).One() - t.Assert(len(one), 5) - return err - }) - t.AssertNil(err) - t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) - }) + ctx = context.Background() + sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { + one, err := db.Model(table).Ctx(ctx).One() + t.Assert(len(one), 5) + return err + }) + t.AssertNil(err) + t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) + }) } // https://github.com/gogf/gf/issues/2552 func Test_Issue2552_ClearTableFields(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - showTableKey := `SHOW FULL COLUMNS FROM` - gtest.C(t, func(t *gtest.T) { - ctx := context.Background() - sqlArray, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { - _, err := db.Model(table).Ctx(ctx).Insert(g.Map{ - "passport": guid.S(), - "password": guid.S(), - "nickname": guid.S(), - "create_time": gtime.NewFromStr(CreateTime).String(), - }) - return err - }) - t.AssertNil(err) - t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) + showTableKey := `SHOW FULL COLUMNS FROM` + gtest.C(t, func(t *gtest.T) { + ctx := context.Background() + sqlArray, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { + _, err := db.Model(table).Ctx(ctx).Insert(g.Map{ + "passport": guid.S(), + "password": guid.S(), + "nickname": guid.S(), + "create_time": gtime.NewFromStr(CreateTime).String(), + }) + return err + }) + t.AssertNil(err) + t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) - ctx = context.Background() - sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { - one, err := db.Model(table).Ctx(ctx).One() - t.Assert(len(one), 6) - return err - }) - t.AssertNil(err) - t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), false) + ctx = context.Background() + sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { + one, err := db.Model(table).Ctx(ctx).One() + t.Assert(len(one), 6) + return err + }) + t.AssertNil(err) + t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), false) - _, err = db.Exec(ctx, fmt.Sprintf("alter table %s drop column `nickname`", table)) - t.AssertNil(err) + _, err = db.Exec(ctx, fmt.Sprintf("alter table %s drop column `nickname`", table)) + t.AssertNil(err) - err = db.GetCore().ClearTableFields(ctx, table) - t.AssertNil(err) + err = db.GetCore().ClearTableFields(ctx, table) + t.AssertNil(err) - ctx = context.Background() - sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { - one, err := db.Model(table).Ctx(ctx).One() - t.Assert(len(one), 5) - return err - }) - t.AssertNil(err) - t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) - }) + ctx = context.Background() + sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { + one, err := db.Model(table).Ctx(ctx).One() + t.Assert(len(one), 5) + return err + }) + t.AssertNil(err) + t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) + }) } // https://github.com/gogf/gf/issues/2643 func Test_Issue2643(t *testing.T) { - table := "issue2643" - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `2643.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) + table := "issue2643" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `2643.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - var ( - expectKey1 = "SELECT s.name,replace(concat_ws(',',lpad(s.id, 6, '0'),s.name),',','') `code` FROM `issue2643` AS s" - expectKey2 = "SELECT CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END dept,sum(s.value) FROM `issue2643` AS s GROUP BY CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END" - ) - sqlArray, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { - db.Ctx(ctx).Model(table).As("s").Fields( - "s.name", - "replace(concat_ws(',',lpad(s.id, 6, '0'),s.name),',','') `code`", - ).All() - db.Ctx(ctx).Model(table).As("s").Fields( - "CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END dept", - "sum(s.value)", - ).Group("CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END").All() - return nil - }) - t.AssertNil(err) - sqlContent := gstr.Join(sqlArray, "\n") - t.Assert(gstr.Contains(sqlContent, expectKey1), true) - t.Assert(gstr.Contains(sqlContent, expectKey2), true) - }) + gtest.C(t, func(t *gtest.T) { + var ( + expectKey1 = "SELECT s.name,replace(concat_ws(',',lpad(s.id, 6, '0'),s.name),',','') `code` FROM `issue2643` AS s" + expectKey2 = "SELECT CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END dept,sum(s.value) FROM `issue2643` AS s GROUP BY CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END" + ) + sqlArray, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { + db.Ctx(ctx).Model(table).As("s").Fields( + "s.name", + "replace(concat_ws(',',lpad(s.id, 6, '0'),s.name),',','') `code`", + ).All() + db.Ctx(ctx).Model(table).As("s").Fields( + "CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END dept", + "sum(s.value)", + ).Group("CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END").All() + return nil + }) + t.AssertNil(err) + sqlContent := gstr.Join(sqlArray, "\n") + t.Assert(gstr.Contains(sqlContent, expectKey1), true) + t.Assert(gstr.Contains(sqlContent, expectKey2), true) + }) } // https://github.com/gogf/gf/issues/3238 func Test_Issue3238(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - for i := 0; i < 100; i++ { - _, err := db.Ctx(ctx).Model(table).Hook(gdb.HookHandler{ - Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { - result, err = in.Next(ctx) - if err != nil { - return - } - var wg sync.WaitGroup - for _, record := range result { - wg.Add(1) - go func(record gdb.Record) { - defer wg.Done() - id, _ := db.Ctx(ctx).Model(table).WherePri(1).Value(`id`) - nickname, _ := db.Ctx(ctx).Model(table).WherePri(1).Value(`nickname`) - t.Assert(id.Int(), 1) - t.Assert(nickname.String(), "name_1") - }(record) - } - wg.Wait() - return - }, - }, - ).All() - t.AssertNil(err) - } - }) + gtest.C(t, func(t *gtest.T) { + for i := 0; i < 100; i++ { + _, err := db.Ctx(ctx).Model(table).Hook(gdb.HookHandler{ + Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { + result, err = in.Next(ctx) + if err != nil { + return + } + var wg sync.WaitGroup + for _, record := range result { + wg.Add(1) + go func(record gdb.Record) { + defer wg.Done() + id, _ := db.Ctx(ctx).Model(table).WherePri(1).Value(`id`) + nickname, _ := db.Ctx(ctx).Model(table).WherePri(1).Value(`nickname`) + t.Assert(id.Int(), 1) + t.Assert(nickname.String(), "name_1") + }(record) + } + wg.Wait() + return + }, + }, + ).All() + t.AssertNil(err) + } + }) } // https://github.com/gogf/gf/issues/3649 func Test_Issue3649(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - sql, err := gdb.CatchSQL(context.Background(), func(ctx context.Context) (err error) { - user := db.Model(table).Ctx(ctx) - _, err = user.Where("create_time = ?", gdb.Raw("now()")).WhereLT("create_time", gdb.Raw("now()")).Count() - return - }) - t.AssertNil(err) - sqlStr := fmt.Sprintf("SELECT COUNT(1) FROM `%s` WHERE (create_time = now()) AND (`create_time` < now())", table) - t.Assert(sql[0], sqlStr) - }) + gtest.C(t, func(t *gtest.T) { + sql, err := gdb.CatchSQL(context.Background(), func(ctx context.Context) (err error) { + user := db.Model(table).Ctx(ctx) + _, err = user.Where("create_time = ?", gdb.Raw("now()")).WhereLT("create_time", gdb.Raw("now()")).Count() + return + }) + t.AssertNil(err) + sqlStr := fmt.Sprintf("SELECT COUNT(1) FROM `%s` WHERE (create_time = now()) AND (`create_time` < now())", table) + t.Assert(sql[0], sqlStr) + }) } // https://github.com/gogf/gf/issues/3754 func Test_Issue3754(t *testing.T) { - table := "issue3754" - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3754.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) + table := "issue3754" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3754.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - fieldsEx := []string{"delete_at", "create_at", "update_at"} - // Insert. - dataInsert := g.Map{ - "id": 1, - "name": "name_1", - } - r, err := db.Model(table).Data(dataInsert).FieldsEx(fieldsEx).Insert() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + gtest.C(t, func(t *gtest.T) { + fieldsEx := []string{"delete_at", "create_at", "update_at"} + // Insert. + dataInsert := g.Map{ + "id": 1, + "name": "name_1", + } + r, err := db.Model(table).Data(dataInsert).FieldsEx(fieldsEx).Insert() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - oneInsert, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(oneInsert["id"].Int(), 1) - t.Assert(oneInsert["name"].String(), "name_1") - t.Assert(oneInsert["delete_at"].String(), "") - t.Assert(oneInsert["create_at"].String(), "") - t.Assert(oneInsert["update_at"].String(), "") + oneInsert, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(oneInsert["id"].Int(), 1) + t.Assert(oneInsert["name"].String(), "name_1") + t.Assert(oneInsert["delete_at"].String(), "") + t.Assert(oneInsert["create_at"].String(), "") + t.Assert(oneInsert["update_at"].String(), "") - // Update. - dataUpdate := g.Map{ - "name": "name_1000", - } - r, err = db.Model(table).Data(dataUpdate).FieldsEx(fieldsEx).WherePri(1).Update() - t.AssertNil(err) - n, _ = r.RowsAffected() - t.Assert(n, 1) + // Update. + dataUpdate := g.Map{ + "name": "name_1000", + } + r, err = db.Model(table).Data(dataUpdate).FieldsEx(fieldsEx).WherePri(1).Update() + t.AssertNil(err) + n, _ = r.RowsAffected() + t.Assert(n, 1) - oneUpdate, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(oneUpdate["id"].Int(), 1) - t.Assert(oneUpdate["name"].String(), "name_1000") - t.Assert(oneUpdate["delete_at"].String(), "") - t.Assert(oneUpdate["create_at"].String(), "") - t.Assert(oneUpdate["update_at"].String(), "") + oneUpdate, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(oneUpdate["id"].Int(), 1) + t.Assert(oneUpdate["name"].String(), "name_1000") + t.Assert(oneUpdate["delete_at"].String(), "") + t.Assert(oneUpdate["create_at"].String(), "") + t.Assert(oneUpdate["update_at"].String(), "") - // FieldsEx does not affect Delete operation. - r, err = db.Model(table).FieldsEx(fieldsEx).WherePri(1).Delete() - n, _ = r.RowsAffected() - t.Assert(n, 1) - oneDeleteUnscoped, err := db.Model(table).Unscoped().WherePri(1).One() - t.AssertNil(err) - t.Assert(oneDeleteUnscoped["id"].Int(), 1) - t.Assert(oneDeleteUnscoped["name"].String(), "name_1000") - t.AssertNE(oneDeleteUnscoped["delete_at"].String(), "") - t.Assert(oneDeleteUnscoped["create_at"].String(), "") - t.Assert(oneDeleteUnscoped["update_at"].String(), "") - }) + // FieldsEx does not affect Delete operation. + r, err = db.Model(table).FieldsEx(fieldsEx).WherePri(1).Delete() + n, _ = r.RowsAffected() + t.Assert(n, 1) + oneDeleteUnscoped, err := db.Model(table).Unscoped().WherePri(1).One() + t.AssertNil(err) + t.Assert(oneDeleteUnscoped["id"].Int(), 1) + t.Assert(oneDeleteUnscoped["name"].String(), "name_1000") + t.AssertNE(oneDeleteUnscoped["delete_at"].String(), "") + t.Assert(oneDeleteUnscoped["create_at"].String(), "") + t.Assert(oneDeleteUnscoped["update_at"].String(), "") + }) } // https://github.com/gogf/gf/issues/3626 func Test_Issue3626(t *testing.T) { - table := "issue3626" - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3626.sql`), ";") - defer dropTable(table) - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } + table := "issue3626" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3626.sql`), ";") + defer dropTable(table) + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } - // Insert. - gtest.C(t, func(t *gtest.T) { - dataInsert := g.Map{ - "id": 1, - "name": "name_1", - } - r, err := db.Model(table).Data(dataInsert).Insert() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + // Insert. + gtest.C(t, func(t *gtest.T) { + dataInsert := g.Map{ + "id": 1, + "name": "name_1", + } + r, err := db.Model(table).Data(dataInsert).Insert() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - oneInsert, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(oneInsert["id"].Int(), 1) - t.Assert(oneInsert["name"].String(), "name_1") - }) + oneInsert, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(oneInsert["id"].Int(), 1) + t.Assert(oneInsert["name"].String(), "name_1") + }) - var ( - cacheKey = guid.S() - cacheFunc = func(duration time.Duration) gdb.HookHandler { - return gdb.HookHandler{ - Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { - get, err := db.GetCache().Get(ctx, cacheKey) - if err == nil && !get.IsEmpty() { - err = get.Scan(&result) - if err == nil { - return result, nil - } - } - result, err = in.Next(ctx) - if err != nil { - return nil, err - } - if result == nil || result.Len() < 1 { - result = make(gdb.Result, 0) - } - _ = db.GetCache().Set(ctx, cacheKey, result, duration) - return - }, - } - } - ) - gtest.C(t, func(t *gtest.T) { - defer db.GetCache().Clear(ctx) - count, err := db.Model(table).Count() - t.AssertNil(err) - t.Assert(count, 1) - count, err = db.Model(table).Hook(cacheFunc(time.Hour)).Count() - t.AssertNil(err) - t.Assert(count, 1) - count, err = db.Model(table).Hook(cacheFunc(time.Hour)).Count() - t.AssertNil(err) - t.Assert(count, 1) - }) + var ( + cacheKey = guid.S() + cacheFunc = func(duration time.Duration) gdb.HookHandler { + return gdb.HookHandler{ + Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { + get, err := db.GetCache().Get(ctx, cacheKey) + if err == nil && !get.IsEmpty() { + err = get.Scan(&result) + if err == nil { + return result, nil + } + } + result, err = in.Next(ctx) + if err != nil { + return nil, err + } + if result == nil || result.Len() < 1 { + result = make(gdb.Result, 0) + } + _ = db.GetCache().Set(ctx, cacheKey, result, duration) + return + }, + } + } + ) + gtest.C(t, func(t *gtest.T) { + defer db.GetCache().Clear(ctx) + count, err := db.Model(table).Count() + t.AssertNil(err) + t.Assert(count, 1) + count, err = db.Model(table).Hook(cacheFunc(time.Hour)).Count() + t.AssertNil(err) + t.Assert(count, 1) + count, err = db.Model(table).Hook(cacheFunc(time.Hour)).Count() + t.AssertNil(err) + t.Assert(count, 1) + }) } // https://github.com/gogf/gf/issues/3932 func Test_Issue3932(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Order("id", "desc").One() - t.AssertNil(err) - t.Assert(one["id"], 10) - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Order("id desc").One() - t.AssertNil(err) - t.Assert(one["id"], 10) - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Order("id desc, nickname asc").One() - t.AssertNil(err) - t.Assert(one["id"], 10) - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Order("id desc", "nickname asc").One() - t.AssertNil(err) - t.Assert(one["id"], 10) - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Order("id desc").Order("nickname asc").One() - t.AssertNil(err) - t.Assert(one["id"], 10) - }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Order("id", "desc").One() + t.AssertNil(err) + t.Assert(one["id"], 10) + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Order("id desc").One() + t.AssertNil(err) + t.Assert(one["id"], 10) + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Order("id desc, nickname asc").One() + t.AssertNil(err) + t.Assert(one["id"], 10) + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Order("id desc", "nickname asc").One() + t.AssertNil(err) + t.Assert(one["id"], 10) + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Order("id desc").Order("nickname asc").One() + t.AssertNil(err) + t.Assert(one["id"], 10) + }) } // https://github.com/gogf/gf/issues/3968 func Test_Issue3968(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - var hook = gdb.HookHandler{ - Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { - result, err = in.Next(ctx) - if err != nil { - return nil, err - } - if result != nil { - for i, _ := range result { - result[i]["location"] = gdb.NewValue("ny") - } - } - return - }, - } - var ( - count int - result gdb.Result - ) - err := db.Model(table).Hook(hook).ScanAndCount(&result, &count, false) - t.AssertNil(err) - t.Assert(count, 10) - t.Assert(len(result), 10) - }) + gtest.C(t, func(t *gtest.T) { + var hook = gdb.HookHandler{ + Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { + result, err = in.Next(ctx) + if err != nil { + return nil, err + } + if result != nil { + for i, _ := range result { + result[i]["location"] = gdb.NewValue("ny") + } + } + return + }, + } + var ( + count int + result gdb.Result + ) + err := db.Model(table).Hook(hook).ScanAndCount(&result, &count, false) + t.AssertNil(err) + t.Assert(count, 10) + t.Assert(len(result), 10) + }) } // https://github.com/gogf/gf/issues/3915 func Test_Issue3915(t *testing.T) { - table := "issue3915" - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3915.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) + table := "issue3915" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3915.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - //db.SetDebug(true) - all, err := db.Model(table).Where("a < b").All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 1) + gtest.C(t, func(t *gtest.T) { + //db.SetDebug(true) + all, err := db.Model(table).Where("a < b").All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 1) - all, err = db.Model(table).Where(gdb.Raw("a < b")).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 1) + all, err = db.Model(table).Where(gdb.Raw("a < b")).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 1) - all, err = db.Model(table).WhereLT("a", gdb.Raw("`b`")).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 1) - }) + all, err = db.Model(table).WhereLT("a", gdb.Raw("`b`")).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 1) + }) - gtest.C(t, func(t *gtest.T) { - //db.SetDebug(true) - all, err := db.Model(table).Where("a > b").All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 2) + gtest.C(t, func(t *gtest.T) { + //db.SetDebug(true) + all, err := db.Model(table).Where("a > b").All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 2) - all, err = db.Model(table).Where(gdb.Raw("a > b")).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 2) + all, err = db.Model(table).Where(gdb.Raw("a > b")).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 2) - all, err = db.Model(table).WhereGT("a", gdb.Raw("`b`")).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 2) - }) + all, err = db.Model(table).WhereGT("a", gdb.Raw("`b`")).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 2) + }) } type RoleBase struct { - gmeta.Meta `orm:"table:sys_role"` - Name string `json:"name" description:"角色名称" ` - Code string `json:"code" description:"角色 code" ` - Description string `json:"description" description:"描述信息" ` - Weight int `json:"weight" description:"排序" ` - StatusId int `json:"statusId" description:"发布状态" ` - CreatedAt *gtime.Time `json:"createdAt" description:"" ` - UpdatedAt *gtime.Time `json:"updatedAt" description:"" ` + gmeta.Meta `orm:"table:sys_role"` + Name string `json:"name" description:"角色名称" ` + Code string `json:"code" description:"角色 code" ` + Description string `json:"description" description:"描述信息" ` + Weight int `json:"weight" description:"排序" ` + StatusId int `json:"statusId" description:"发布状态" ` + CreatedAt *gtime.Time `json:"createdAt" description:"" ` + UpdatedAt *gtime.Time `json:"updatedAt" description:"" ` } type Role struct { - gmeta.Meta `orm:"table:sys_role"` - RoleBase - Id uint `json:"id" description:""` - Status *Status `json:"status" description:"发布状态" orm:"with:id=status_id" ` + gmeta.Meta `orm:"table:sys_role"` + RoleBase + Id uint `json:"id" description:""` + Status *Status `json:"status" description:"发布状态" orm:"with:id=status_id" ` } type StatusBase struct { - gmeta.Meta `orm:"table:sys_status"` - En string `json:"en" description:"英文名称" ` - Cn string `json:"cn" description:"中文名称" ` - Weight int `json:"weight" description:"排序权重" ` + gmeta.Meta `orm:"table:sys_status"` + En string `json:"en" description:"英文名称" ` + Cn string `json:"cn" description:"中文名称" ` + Weight int `json:"weight" description:"排序权重" ` } type Status struct { - gmeta.Meta `orm:"table:sys_status"` - StatusBase - Id uint `json:"id" description:""` + gmeta.Meta `orm:"table:sys_status"` + StatusBase + Id uint `json:"id" description:""` } // https://github.com/gogf/gf/issues/2119 func Test_Issue2119(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - tables := []string{ - "sys_role", - "sys_status", - } + gtest.C(t, func(t *gtest.T) { + tables := []string{ + "sys_role", + "sys_status", + } - defer dropTable(tables[0]) - defer dropTable(tables[1]) - _ = tables - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `2119.sql`), ";") - for _, v := range array { - _, err := db.Exec(ctx, v) - t.AssertNil(err) - } - roles := make([]*Role, 0) - err := db.Ctx(context.Background()).Model(&Role{}).WithAll().Scan(&roles) - t.AssertNil(err) - expectStatus := []*Status{ - { - StatusBase: StatusBase{ - En: "undecided", - Cn: "未决定", - Weight: 800, - }, - Id: 2, - }, - { - StatusBase: StatusBase{ - En: "on line", - Cn: "上线", - Weight: 900, - }, - Id: 1, - }, - { - StatusBase: StatusBase{ - En: "on line", - Cn: "上线", - Weight: 900, - }, - Id: 1, - }, - { - StatusBase: StatusBase{ - En: "on line", - Cn: "上线", - Weight: 900, - }, - Id: 1, - }, - { - StatusBase: StatusBase{ - En: "on line", - Cn: "上线", - Weight: 900, - }, - Id: 1, - }, - } + defer dropTable(tables[0]) + defer dropTable(tables[1]) + _ = tables + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `2119.sql`), ";") + for _, v := range array { + _, err := db.Exec(ctx, v) + t.AssertNil(err) + } + roles := make([]*Role, 0) + err := db.Ctx(context.Background()).Model(&Role{}).WithAll().Scan(&roles) + t.AssertNil(err) + expectStatus := []*Status{ + { + StatusBase: StatusBase{ + En: "undecided", + Cn: "未决定", + Weight: 800, + }, + Id: 2, + }, + { + StatusBase: StatusBase{ + En: "on line", + Cn: "上线", + Weight: 900, + }, + Id: 1, + }, + { + StatusBase: StatusBase{ + En: "on line", + Cn: "上线", + Weight: 900, + }, + Id: 1, + }, + { + StatusBase: StatusBase{ + En: "on line", + Cn: "上线", + Weight: 900, + }, + Id: 1, + }, + { + StatusBase: StatusBase{ + En: "on line", + Cn: "上线", + Weight: 900, + }, + Id: 1, + }, + } - for i := 0; i < len(roles); i++ { - t.Assert(roles[i].Status, expectStatus[i]) - } - }) + for i := 0; i < len(roles); i++ { + t.Assert(roles[i].Status, expectStatus[i]) + } + }) } // https://github.com/gogf/gf/issues/4034 func Test_Issue4034(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table := "issue4034" - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `4034.sql`), ";") - for _, v := range array { - _, err := db.Exec(ctx, v) - t.AssertNil(err) - } - defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + table := "issue4034" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `4034.sql`), ";") + for _, v := range array { + _, err := db.Exec(ctx, v) + t.AssertNil(err) + } + defer dropTable(table) - err := issue4034SaveDeviceAndToken(ctx, table) - t.AssertNil(err) - }) + err := issue4034SaveDeviceAndToken(ctx, table) + t.AssertNil(err) + }) } func issue4034SaveDeviceAndToken(ctx context.Context, table string) error { - return db.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { - if err := issue4034SaveAppDevice(ctx, table, tx); err != nil { - return err - } - return nil - }) + return db.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + if err := issue4034SaveAppDevice(ctx, table, tx); err != nil { + return err + } + return nil + }) } func issue4034SaveAppDevice(ctx context.Context, table string, tx gdb.TX) error { - _, err := db.Model(table).Safe().Ctx(ctx).TX(tx).Data(g.Map{ - "passport": "111", - "password": "222", - "nickname": "333", - }).Save() - return err + _, err := db.Model(table).Safe().Ctx(ctx).TX(tx).Data(g.Map{ + "passport": "111", + "password": "222", + "nickname": "333", + }).Save() + return err } // https://github.com/gogf/gf/issues/4086 func Test_Issue4086(t *testing.T) { - table := "issue4086" - defer dropTable(table) - array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `4086.sql`), ";") - for _, v := range array { - _, err := db.Exec(ctx, v) - gtest.AssertNil(err) - } + table := "issue4086" + defer dropTable(table) + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `4086.sql`), ";") + for _, v := range array { + _, err := db.Exec(ctx, v) + gtest.AssertNil(err) + } - gtest.C(t, func(t *gtest.T) { - type ProxyParam struct { - ProxyId int64 `json:"proxyId" orm:"proxy_id"` - RecommendIds []int64 `json:"recommendIds" orm:"recommend_ids"` - Photos []string `json:"photos" orm:"photos"` - } + gtest.C(t, func(t *gtest.T) { + type ProxyParam struct { + ProxyId int64 `json:"proxyId" orm:"proxy_id"` + RecommendIds []int64 `json:"recommendIds" orm:"recommend_ids"` + Photos []string `json:"photos" orm:"photos"` + } - var proxyParamList []*ProxyParam - err := db.Model(table).Ctx(ctx).Scan(&proxyParamList) - t.AssertNil(err) - t.Assert(len(proxyParamList), 2) - t.Assert(proxyParamList, []*ProxyParam{ - { - ProxyId: 1, - RecommendIds: []int64{584, 585}, - Photos: nil, - }, - { - ProxyId: 2, - RecommendIds: []int64{}, - Photos: nil, - }, - }) - }) - gtest.C(t, func(t *gtest.T) { - type ProxyParam struct { - ProxyId int64 `json:"proxyId" orm:"proxy_id"` - RecommendIds []int64 `json:"recommendIds" orm:"recommend_ids"` - Photos []any `json:"photos" orm:"photos"` - } + var proxyParamList []*ProxyParam + err := db.Model(table).Ctx(ctx).Scan(&proxyParamList) + t.AssertNil(err) + t.Assert(len(proxyParamList), 2) + t.Assert(proxyParamList, []*ProxyParam{ + { + ProxyId: 1, + RecommendIds: []int64{584, 585}, + Photos: nil, + }, + { + ProxyId: 2, + RecommendIds: []int64{}, + Photos: nil, + }, + }) + }) + gtest.C(t, func(t *gtest.T) { + type ProxyParam struct { + ProxyId int64 `json:"proxyId" orm:"proxy_id"` + RecommendIds []int64 `json:"recommendIds" orm:"recommend_ids"` + Photos []any `json:"photos" orm:"photos"` + } - var proxyParamList []*ProxyParam - err := db.Model(table).Ctx(ctx).Scan(&proxyParamList) - t.AssertNil(err) - t.Assert(len(proxyParamList), 2) - t.Assert(proxyParamList, []*ProxyParam{ - { - ProxyId: 1, - RecommendIds: []int64{584, 585}, - Photos: nil, - }, - { - ProxyId: 2, - RecommendIds: []int64{}, - Photos: nil, - }, - }) - }) - gtest.C(t, func(t *gtest.T) { - type ProxyParam struct { - ProxyId int64 `json:"proxyId" orm:"proxy_id"` - RecommendIds []int64 `json:"recommendIds" orm:"recommend_ids"` - Photos string `json:"photos" orm:"photos"` - } + var proxyParamList []*ProxyParam + err := db.Model(table).Ctx(ctx).Scan(&proxyParamList) + t.AssertNil(err) + t.Assert(len(proxyParamList), 2) + t.Assert(proxyParamList, []*ProxyParam{ + { + ProxyId: 1, + RecommendIds: []int64{584, 585}, + Photos: nil, + }, + { + ProxyId: 2, + RecommendIds: []int64{}, + Photos: nil, + }, + }) + }) + gtest.C(t, func(t *gtest.T) { + type ProxyParam struct { + ProxyId int64 `json:"proxyId" orm:"proxy_id"` + RecommendIds []int64 `json:"recommendIds" orm:"recommend_ids"` + Photos string `json:"photos" orm:"photos"` + } - var proxyParamList []*ProxyParam - err := db.Model(table).Ctx(ctx).Scan(&proxyParamList) - t.AssertNil(err) - t.Assert(len(proxyParamList), 2) - t.Assert(proxyParamList, []*ProxyParam{ - { - ProxyId: 1, - RecommendIds: []int64{584, 585}, - Photos: "null", - }, - { - ProxyId: 2, - RecommendIds: []int64{}, - Photos: "", - }, - }) - }) - gtest.C(t, func(t *gtest.T) { - type ProxyParam struct { - ProxyId int64 `json:"proxyId" orm:"proxy_id"` - RecommendIds string `json:"recommendIds" orm:"recommend_ids"` - Photos json.RawMessage `json:"photos" orm:"photos"` - } + var proxyParamList []*ProxyParam + err := db.Model(table).Ctx(ctx).Scan(&proxyParamList) + t.AssertNil(err) + t.Assert(len(proxyParamList), 2) + t.Assert(proxyParamList, []*ProxyParam{ + { + ProxyId: 1, + RecommendIds: []int64{584, 585}, + Photos: "null", + }, + { + ProxyId: 2, + RecommendIds: []int64{}, + Photos: "", + }, + }) + }) + gtest.C(t, func(t *gtest.T) { + type ProxyParam struct { + ProxyId int64 `json:"proxyId" orm:"proxy_id"` + RecommendIds string `json:"recommendIds" orm:"recommend_ids"` + Photos json.RawMessage `json:"photos" orm:"photos"` + } - var proxyParamList []*ProxyParam - err := db.Model(table).Ctx(ctx).Scan(&proxyParamList) - t.AssertNil(err) - t.Assert(len(proxyParamList), 2) - t.Assert(proxyParamList, []*ProxyParam{ - { - ProxyId: 1, - RecommendIds: "[584, 585]", - Photos: json.RawMessage("null"), - }, - { - ProxyId: 2, - RecommendIds: "[]", - Photos: json.RawMessage("null"), - }, - }) - }) + var proxyParamList []*ProxyParam + err := db.Model(table).Ctx(ctx).Scan(&proxyParamList) + t.AssertNil(err) + t.Assert(len(proxyParamList), 2) + t.Assert(proxyParamList, []*ProxyParam{ + { + ProxyId: 1, + RecommendIds: "[584, 585]", + Photos: json.RawMessage("null"), + }, + { + ProxyId: 2, + RecommendIds: "[]", + Photos: json.RawMessage("null"), + }, + }) + }) } diff --git a/contrib/drivers/mysql/mysql_z_unit_model_test.go b/contrib/drivers/mysql/mysql_z_unit_model_test.go index 9ae609d73..54117359c 100644 --- a/contrib/drivers/mysql/mysql_z_unit_model_test.go +++ b/contrib/drivers/mysql/mysql_z_unit_model_test.go @@ -7,584 +7,584 @@ package mysql_test import ( - "bytes" - "context" - "database/sql" - "fmt" - "os" - "strings" - "testing" - "time" + "bytes" + "context" + "database/sql" + "fmt" + "os" + "strings" + "testing" + "time" - "github.com/gogf/gf/v2/container/garray" - "github.com/gogf/gf/v2/database/gdb" - "github.com/gogf/gf/v2/encoding/gjson" - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/os/gfile" - "github.com/gogf/gf/v2/os/glog" - "github.com/gogf/gf/v2/os/gtime" - "github.com/gogf/gf/v2/test/gtest" - "github.com/gogf/gf/v2/text/gstr" - "github.com/gogf/gf/v2/util/guid" + "github.com/gogf/gf/v2/container/garray" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/encoding/gjson" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gfile" + "github.com/gogf/gf/v2/os/glog" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/test/gtest" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/guid" ) func Test_Model_Insert(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - user := db.Model(table) - result, err := user.Data(g.Map{ - "id": 1, - "uid": 1, - "passport": "t1", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_1", - "create_time": gtime.Now().String(), - }).Insert() - t.AssertNil(err) - n, _ := result.LastInsertId() - t.Assert(n, 1) + gtest.C(t, func(t *gtest.T) { + user := db.Model(table) + result, err := user.Data(g.Map{ + "id": 1, + "uid": 1, + "passport": "t1", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_1", + "create_time": gtime.Now().String(), + }).Insert() + t.AssertNil(err) + n, _ := result.LastInsertId() + t.Assert(n, 1) - result, err = db.Model(table).Data(g.Map{ - "id": "2", - "uid": "2", - "passport": "t2", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_2", - "create_time": gtime.Now().String(), - }).Insert() - t.AssertNil(err) - n, _ = result.RowsAffected() - t.Assert(n, 1) + result, err = db.Model(table).Data(g.Map{ + "id": "2", + "uid": "2", + "passport": "t2", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_2", + "create_time": gtime.Now().String(), + }).Insert() + t.AssertNil(err) + n, _ = result.RowsAffected() + t.Assert(n, 1) - type User struct { - Id int `gconv:"id"` - Uid int `gconv:"uid"` - Passport string `json:"passport"` - Password string `gconv:"password"` - Nickname string `gconv:"nickname"` - CreateTime *gtime.Time `json:"create_time"` - } - // Model inserting. - result, err = db.Model(table).Data(User{ - Id: 3, - Uid: 3, - Passport: "t3", - Password: "25d55ad283aa400af464c76d713c07ad", - Nickname: "name_3", - }).Insert() - t.AssertNil(err) - n, _ = result.RowsAffected() - t.Assert(n, 1) - value, err := db.Model(table).Fields("passport").Where("id=3").Value() - t.AssertNil(err) - t.Assert(value.String(), "t3") + type User struct { + Id int `gconv:"id"` + Uid int `gconv:"uid"` + Passport string `json:"passport"` + Password string `gconv:"password"` + Nickname string `gconv:"nickname"` + CreateTime *gtime.Time `json:"create_time"` + } + // Model inserting. + result, err = db.Model(table).Data(User{ + Id: 3, + Uid: 3, + Passport: "t3", + Password: "25d55ad283aa400af464c76d713c07ad", + Nickname: "name_3", + }).Insert() + t.AssertNil(err) + n, _ = result.RowsAffected() + t.Assert(n, 1) + value, err := db.Model(table).Fields("passport").Where("id=3").Value() + t.AssertNil(err) + t.Assert(value.String(), "t3") - result, err = db.Model(table).Data(&User{ - Id: 4, - Uid: 4, - Passport: "t4", - Password: "25d55ad283aa400af464c76d713c07ad", - Nickname: "T4", - CreateTime: gtime.Now(), - }).Insert() - t.AssertNil(err) - n, _ = result.RowsAffected() - t.Assert(n, 1) - value, err = db.Model(table).Fields("passport").Where("id=4").Value() - t.AssertNil(err) - t.Assert(value.String(), "t4") + result, err = db.Model(table).Data(&User{ + Id: 4, + Uid: 4, + Passport: "t4", + Password: "25d55ad283aa400af464c76d713c07ad", + Nickname: "T4", + CreateTime: gtime.Now(), + }).Insert() + t.AssertNil(err) + n, _ = result.RowsAffected() + t.Assert(n, 1) + value, err = db.Model(table).Fields("passport").Where("id=4").Value() + t.AssertNil(err) + t.Assert(value.String(), "t4") - result, err = db.Model(table).Where("id>?", 1).Delete() - t.AssertNil(err) - n, _ = result.RowsAffected() - t.Assert(n, 3) - }) + result, err = db.Model(table).Where("id>?", 1).Delete() + t.AssertNil(err) + n, _ = result.RowsAffected() + t.Assert(n, 3) + }) } // Fix issue: https://github.com/gogf/gf/issues/819 func Test_Model_Insert_WithStructAndSliceAttribute(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type Password struct { - Salt string `json:"salt"` - Pass string `json:"pass"` - } - data := g.Map{ - "id": 1, - "passport": "t1", - "password": &Password{"123", "456"}, - "nickname": []string{"A", "B", "C"}, - "create_time": gtime.Now().String(), - } - _, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type Password struct { + Salt string `json:"salt"` + Pass string `json:"pass"` + } + data := g.Map{ + "id": 1, + "passport": "t1", + "password": &Password{"123", "456"}, + "nickname": []string{"A", "B", "C"}, + "create_time": gtime.Now().String(), + } + _, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) - one, err := db.Model(table).One("id", 1) - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["create_time"], data["create_time"]) - t.Assert(one["nickname"], gjson.New(data["nickname"]).MustToJson()) - }) + one, err := db.Model(table).One("id", 1) + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["create_time"], data["create_time"]) + t.Assert(one["nickname"], gjson.New(data["nickname"]).MustToJson()) + }) } func Test_Model_Insert_KeyFieldNameMapping(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - Nickname string - CreateTime string - } - data := User{ - Id: 1, - Passport: "user_1", - Password: "pass_1", - Nickname: "name_1", - CreateTime: "2020-10-10 12:00:01", - } - _, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + Nickname string + CreateTime string + } + data := User{ + Id: 1, + Passport: "user_1", + Password: "pass_1", + Nickname: "name_1", + CreateTime: "2020-10-10 12:00:01", + } + _, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data.Passport) - t.Assert(one["create_time"], data.CreateTime) - t.Assert(one["nickname"], data.Nickname) - }) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data.Passport) + t.Assert(one["create_time"], data.CreateTime) + t.Assert(one["nickname"], data.Nickname) + }) } func Test_Model_Update_KeyFieldNameMapping(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - Nickname string - CreateTime string - } - data := User{ - Id: 1, - Passport: "user_10", - Password: "pass_10", - Nickname: "name_10", - CreateTime: "2020-10-10 12:00:01", - } - _, err := db.Model(table).Data(data).WherePri(1).Update() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + Nickname string + CreateTime string + } + data := User{ + Id: 1, + Passport: "user_10", + Password: "pass_10", + Nickname: "name_10", + CreateTime: "2020-10-10 12:00:01", + } + _, err := db.Model(table).Data(data).WherePri(1).Update() + t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data.Passport) - t.Assert(one["create_time"], data.CreateTime) - t.Assert(one["nickname"], data.Nickname) - }) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data.Passport) + t.Assert(one["create_time"], data.CreateTime) + t.Assert(one["nickname"], data.Nickname) + }) } func Test_Model_Insert_Time(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "t1", - "password": "p1", - "nickname": "n1", - "create_time": "2020-10-10 20:09:18.334", - } - _, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "t1", + "password": "p1", + "nickname": "n1", + "create_time": "2020-10-10 20:09:18.334", + } + _, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) - one, err := db.Model(table).One("id", 1) - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["create_time"], "2020-10-10 20:09:18") - t.Assert(one["nickname"], data["nickname"]) - }) + one, err := db.Model(table).One("id", 1) + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["create_time"], "2020-10-10 20:09:18") + t.Assert(one["nickname"], data["nickname"]) + }) } func Test_Model_BatchInsertWithArrayStruct(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - user := db.Model(table) - array := garray.New() - for i := 1; i <= TableSize; i++ { - array.Append(g.Map{ - "id": i, - "uid": i, - "passport": fmt.Sprintf("t%d", i), - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": fmt.Sprintf("name_%d", i), - "create_time": gtime.Now().String(), - }) - } + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + user := db.Model(table) + array := garray.New() + for i := 1; i <= TableSize; i++ { + array.Append(g.Map{ + "id": i, + "uid": i, + "passport": fmt.Sprintf("t%d", i), + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": fmt.Sprintf("name_%d", i), + "create_time": gtime.Now().String(), + }) + } - result, err := user.Data(array).Insert() - t.AssertNil(err) - n, _ := result.LastInsertId() - t.Assert(n, TableSize) - }) + result, err := user.Data(array).Insert() + t.AssertNil(err) + n, _ := result.LastInsertId() + t.Assert(n, TableSize) + }) } func Test_Model_InsertIgnore(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).Data(g.Map{ - "id": 1, - "uid": 1, - "passport": "t1", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_1", - "create_time": gtime.Now().String(), - }).Insert() - t.AssertNE(err, nil) - }) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).Data(g.Map{ - "id": 1, - "uid": 1, - "passport": "t1", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_1", - "create_time": gtime.Now().String(), - }).InsertIgnore() - t.AssertNil(err) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).Data(g.Map{ + "id": 1, + "uid": 1, + "passport": "t1", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_1", + "create_time": gtime.Now().String(), + }).Insert() + t.AssertNE(err, nil) + }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).Data(g.Map{ + "id": 1, + "uid": 1, + "passport": "t1", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_1", + "create_time": gtime.Now().String(), + }).InsertIgnore() + t.AssertNil(err) + }) } func Test_Model_Batch(t *testing.T) { - // batch insert - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - result, err := db.Model(table).Data(g.List{ - { - "id": 2, - "uid": 2, - "passport": "t2", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_2", - "create_time": gtime.Now().String(), - }, - { - "id": 3, - "uid": 3, - "passport": "t3", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_3", - "create_time": gtime.Now().String(), - }, - }).Batch(1).Insert() - if err != nil { - gtest.Error(err) - } - n, _ := result.RowsAffected() - t.Assert(n, 2) - }) + // batch insert + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + result, err := db.Model(table).Data(g.List{ + { + "id": 2, + "uid": 2, + "passport": "t2", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_2", + "create_time": gtime.Now().String(), + }, + { + "id": 3, + "uid": 3, + "passport": "t3", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_3", + "create_time": gtime.Now().String(), + }, + }).Batch(1).Insert() + if err != nil { + gtest.Error(err) + } + n, _ := result.RowsAffected() + t.Assert(n, 2) + }) - // batch insert, retrieving last insert auto-increment id. - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - result, err := db.Model(table).Data(g.List{ - {"passport": "t1"}, - {"passport": "t2"}, - {"passport": "t3"}, - {"passport": "t4"}, - {"passport": "t5"}, - }).Batch(2).Insert() - if err != nil { - gtest.Error(err) - } - n, _ := result.RowsAffected() - t.Assert(n, 5) - }) + // batch insert, retrieving last insert auto-increment id. + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + result, err := db.Model(table).Data(g.List{ + {"passport": "t1"}, + {"passport": "t2"}, + {"passport": "t3"}, + {"passport": "t4"}, + {"passport": "t5"}, + }).Batch(2).Insert() + if err != nil { + gtest.Error(err) + } + n, _ := result.RowsAffected() + t.Assert(n, 5) + }) - // batch save - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) - result, err := db.Model(table).All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - for _, v := range result { - v["nickname"].Set(v["nickname"].String() + v["id"].String()) - } - r, e := db.Model(table).Data(result).Save() - t.Assert(e, nil) - n, e := r.RowsAffected() - t.Assert(e, nil) - t.Assert(n, TableSize*2) - }) + // batch save + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) + result, err := db.Model(table).All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + for _, v := range result { + v["nickname"].Set(v["nickname"].String() + v["id"].String()) + } + r, e := db.Model(table).Data(result).Save() + t.Assert(e, nil) + n, e := r.RowsAffected() + t.Assert(e, nil) + t.Assert(n, TableSize*2) + }) - // batch replace - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) - result, err := db.Model(table).All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - for _, v := range result { - v["nickname"].Set(v["nickname"].String() + v["id"].String()) - } - r, e := db.Model(table).Data(result).Replace() - t.Assert(e, nil) - n, e := r.RowsAffected() - t.Assert(e, nil) - t.Assert(n, TableSize*2) - }) + // batch replace + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) + result, err := db.Model(table).All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + for _, v := range result { + v["nickname"].Set(v["nickname"].String() + v["id"].String()) + } + r, e := db.Model(table).Data(result).Replace() + t.Assert(e, nil) + n, e := r.RowsAffected() + t.Assert(e, nil) + t.Assert(n, TableSize*2) + }) } func Test_Model_Replace(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.Map{ - "id": 1, - "passport": "t11", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "T11", - "create_time": "2018-10-24 10:00:00", - }).Replace() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.Map{ + "id": 1, + "passport": "t11", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "T11", + "create_time": "2018-10-24 10:00:00", + }).Replace() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) } func Test_Model_Save(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.Map{ - "id": 1, - "passport": "t111", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "T111", - "create_time": "2018-10-24 10:00:00", - }).Save() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.Map{ + "id": 1, + "passport": "t111", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "T111", + "create_time": "2018-10-24 10:00:00", + }).Save() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) } func Test_Model_Update(t *testing.T) { - table := createInitTable() - defer dropTable(table) - // UPDATE...LIMIT - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data("nickname", "T100").Where(1).Order("id desc").Limit(2).Update() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 2) + table := createInitTable() + defer dropTable(table) + // UPDATE...LIMIT + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data("nickname", "T100").Where(1).Order("id desc").Limit(2).Update() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 2) - v1, err := db.Model(table).Fields("nickname").Where("id", 10).Value() - t.AssertNil(err) - t.Assert(v1.String(), "T100") + v1, err := db.Model(table).Fields("nickname").Where("id", 10).Value() + t.AssertNil(err) + t.Assert(v1.String(), "T100") - v2, err := db.Model(table).Fields("nickname").Where("id", 8).Value() - t.AssertNil(err) - t.Assert(v2.String(), "name_8") - }) + v2, err := db.Model(table).Fields("nickname").Where("id", 8).Value() + t.AssertNil(err) + t.Assert(v2.String(), "name_8") + }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data("passport", "user_22").Where("passport=?", "user_2").Update() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data("passport", "user_22").Where("passport=?", "user_2").Update() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data("passport", "user_2").Where("passport='user_22'").Update() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data("passport", "user_2").Where("passport='user_22'").Update() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) - // Update + Data(string) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data("passport='user_33'").Where("passport='user_3'").Update() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - // Update + Fields(string) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Fields("passport").Data(g.Map{ - "passport": "user_44", - "none": "none", - }).Where("passport='user_4'").Update() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) + // Update + Data(string) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data("passport='user_33'").Where("passport='user_3'").Update() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + // Update + Fields(string) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Fields("passport").Data(g.Map{ + "passport": "user_44", + "none": "none", + }).Where("passport='user_4'").Update() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) } func Test_Model_UpdateAndGetAffected(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - n, err := db.Model(table).Data("nickname", "T100"). - Where(1).Order("id desc").Limit(2). - UpdateAndGetAffected() - t.AssertNil(err) - t.Assert(n, 2) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + n, err := db.Model(table).Data("nickname", "T100"). + Where(1).Order("id desc").Limit(2). + UpdateAndGetAffected() + t.AssertNil(err) + t.Assert(n, 2) + }) } func Test_Model_Clone(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - md := db.Model(table).Safe(true).Where("id IN(?)", g.Slice{1, 3}) - count, err := md.Count() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + md := db.Model(table).Safe(true).Where("id IN(?)", g.Slice{1, 3}) + count, err := md.Count() + t.AssertNil(err) - record, err := md.Safe(true).Order("id DESC").One() - t.AssertNil(err) + record, err := md.Safe(true).Order("id DESC").One() + t.AssertNil(err) - result, err := md.Safe(true).Order("id ASC").All() - t.AssertNil(err) + result, err := md.Safe(true).Order("id ASC").All() + t.AssertNil(err) - t.Assert(count, int64(2)) - t.Assert(record["id"].Int(), 3) - t.Assert(len(result), 2) - t.Assert(result[0]["id"].Int(), 1) - t.Assert(result[1]["id"].Int(), 3) - }) + t.Assert(count, int64(2)) + t.Assert(record["id"].Int(), 3) + t.Assert(len(result), 2) + t.Assert(result[0]["id"].Int(), 1) + t.Assert(result[1]["id"].Int(), 3) + }) } func Test_Model_Safe(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - md := db.Model(table).Safe(false).Where("id IN(?)", g.Slice{1, 3}) - count, err := md.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) + gtest.C(t, func(t *gtest.T) { + md := db.Model(table).Safe(false).Where("id IN(?)", g.Slice{1, 3}) + count, err := md.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) - md.Where("id = ?", 1) - count, err = md.Count() - t.AssertNil(err) - t.Assert(count, int64(1)) - }) - gtest.C(t, func(t *gtest.T) { - md := db.Model(table).Safe(true).Where("id IN(?)", g.Slice{1, 3}) - count, err := md.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) + md.Where("id = ?", 1) + count, err = md.Count() + t.AssertNil(err) + t.Assert(count, int64(1)) + }) + gtest.C(t, func(t *gtest.T) { + md := db.Model(table).Safe(true).Where("id IN(?)", g.Slice{1, 3}) + count, err := md.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) - md.Where("id = ?", 1) - count, err = md.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) - }) + md.Where("id = ?", 1) + count, err = md.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) + }) - gtest.C(t, func(t *gtest.T) { - md := db.Model(table).Safe().Where("id IN(?)", g.Slice{1, 3}) - count, err := md.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) + gtest.C(t, func(t *gtest.T) { + md := db.Model(table).Safe().Where("id IN(?)", g.Slice{1, 3}) + count, err := md.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) - md.Where("id = ?", 1) - count, err = md.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) - }) - gtest.C(t, func(t *gtest.T) { - md1 := db.Model(table).Safe() - md2 := md1.Where("id in (?)", g.Slice{1, 3}) - count, err := md2.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) + md.Where("id = ?", 1) + count, err = md.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) + }) + gtest.C(t, func(t *gtest.T) { + md1 := db.Model(table).Safe() + md2 := md1.Where("id in (?)", g.Slice{1, 3}) + count, err := md2.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) - all, err := md2.All() - t.AssertNil(err) - t.Assert(len(all), 2) + all, err := md2.All() + t.AssertNil(err) + t.Assert(len(all), 2) - all, err = md2.Page(1, 10).All() - t.AssertNil(err) - t.Assert(len(all), 2) - }) + all, err = md2.Page(1, 10).All() + t.AssertNil(err) + t.Assert(len(all), 2) + }) - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) - md1 := db.Model(table).Where("id>", 0).Safe() - md2 := md1.Where("id in (?)", g.Slice{1, 3}) - md3 := md1.Where("id in (?)", g.Slice{4, 5, 6}) + md1 := db.Model(table).Where("id>", 0).Safe() + md2 := md1.Where("id in (?)", g.Slice{1, 3}) + md3 := md1.Where("id in (?)", g.Slice{4, 5, 6}) - // 1,3 - count, err := md2.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) + // 1,3 + count, err := md2.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) - all, err := md2.Order("id asc").All() - t.AssertNil(err) - t.Assert(len(all), 2) - t.Assert(all[0]["id"].Int(), 1) - t.Assert(all[1]["id"].Int(), 3) + all, err := md2.Order("id asc").All() + t.AssertNil(err) + t.Assert(len(all), 2) + t.Assert(all[0]["id"].Int(), 1) + t.Assert(all[1]["id"].Int(), 3) - all, err = md2.Page(1, 10).All() - t.AssertNil(err) - t.Assert(len(all), 2) + all, err = md2.Page(1, 10).All() + t.AssertNil(err) + t.Assert(len(all), 2) - // 4,5,6 - count, err = md3.Count() - t.AssertNil(err) - t.Assert(count, int64(3)) + // 4,5,6 + count, err = md3.Count() + t.AssertNil(err) + t.Assert(count, int64(3)) - all, err = md3.Order("id asc").All() - t.AssertNil(err) - t.Assert(len(all), 3) - t.Assert(all[0]["id"].Int(), 4) - t.Assert(all[1]["id"].Int(), 5) - t.Assert(all[2]["id"].Int(), 6) + all, err = md3.Order("id asc").All() + t.AssertNil(err) + t.Assert(len(all), 3) + t.Assert(all[0]["id"].Int(), 4) + t.Assert(all[1]["id"].Int(), 5) + t.Assert(all[2]["id"].Int(), 6) - all, err = md3.Page(1, 10).All() - t.AssertNil(err) - t.Assert(len(all), 3) - }) + all, err = md3.Page(1, 10).All() + t.AssertNil(err) + t.Assert(len(all), 3) + }) } func Test_Model_All(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where("id<0").All() - t.Assert(result, nil) - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where("id<0").All() + t.Assert(result, nil) + t.AssertNil(err) + }) } func Test_Model_Fields(t *testing.T) { - tableName1 := createInitTable() - defer dropTable(tableName1) + tableName1 := createInitTable() + defer dropTable(tableName1) - tableName2 := "user_" + gtime.Now().TimestampNanoStr() - if _, err := db.Exec(ctx, fmt.Sprintf(` + tableName2 := "user_" + gtime.Now().TimestampNanoStr() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(45) NULL, @@ -592,1924 +592,1924 @@ func Test_Model_Fields(t *testing.T) { PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, tableName2, - )); err != nil { - gtest.AssertNil(err) - } - defer dropTable(tableName2) + )); err != nil { + gtest.AssertNil(err) + } + defer dropTable(tableName2) - r, err := db.Insert(ctx, tableName2, g.Map{ - "id": 1, - "name": "table2_1", - "age": 18, - }) - gtest.AssertNil(err) - n, _ := r.RowsAffected() - gtest.Assert(n, 1) + r, err := db.Insert(ctx, tableName2, g.Map{ + "id": 1, + "name": "table2_1", + "age": 18, + }) + gtest.AssertNil(err) + n, _ := r.RowsAffected() + gtest.Assert(n, 1) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(tableName1).As("u").Fields("u.passport,u.id").Where("u.id<2").All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(len(all[0]), 2) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(tableName1).As("u1"). - LeftJoin(tableName1, "u2", "u2.id=u1.id"). - Fields("u1.passport,u1.id,u2.id AS u2id"). - Where("u1.id<2"). - All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(len(all[0]), 3) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(tableName1).As("u1"). - LeftJoin(tableName2, "u2", "u2.id=u1.id"). - Fields("u1.passport,u1.id,u2.name,u2.age"). - Where("u1.id<2"). - All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(len(all[0]), 4) - t.Assert(all[0]["id"], 1) - t.Assert(all[0]["age"], 18) - t.Assert(all[0]["name"], "table2_1") - t.Assert(all[0]["passport"], "user_1") - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(tableName1).As("u").Fields("u.passport,u.id").Where("u.id<2").All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(len(all[0]), 2) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(tableName1).As("u1"). + LeftJoin(tableName1, "u2", "u2.id=u1.id"). + Fields("u1.passport,u1.id,u2.id AS u2id"). + Where("u1.id<2"). + All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(len(all[0]), 3) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(tableName1).As("u1"). + LeftJoin(tableName2, "u2", "u2.id=u1.id"). + Fields("u1.passport,u1.id,u2.name,u2.age"). + Where("u1.id<2"). + All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(len(all[0]), 4) + t.Assert(all[0]["id"], 1) + t.Assert(all[0]["age"], 18) + t.Assert(all[0]["name"], "table2_1") + t.Assert(all[0]["passport"], "user_1") + }) } func Test_Model_One(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - record, err := db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.Assert(record["nickname"].String(), "name_1") - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + record, err := db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.Assert(record["nickname"].String(), "name_1") + }) - gtest.C(t, func(t *gtest.T) { - record, err := db.Model(table).Where("id", 0).One() - t.AssertNil(err) - t.Assert(record, nil) - }) + gtest.C(t, func(t *gtest.T) { + record, err := db.Model(table).Where("id", 0).One() + t.AssertNil(err) + t.Assert(record, nil) + }) } func Test_Model_Value(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Fields("nickname").Where("id", 1).Value() - t.AssertNil(err) - t.Assert(value.String(), "name_1") - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Fields("nickname").Where("id", 1).Value() + t.AssertNil(err) + t.Assert(value.String(), "name_1") + }) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Fields("nickname").Where("id", 0).Value() - t.AssertNil(err) - t.Assert(value, nil) - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Fields("nickname").Where("id", 0).Value() + t.AssertNil(err) + t.Assert(value, nil) + }) } func Test_Model_Array(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id", g.Slice{1, 2, 3}).All() - t.AssertNil(err) - t.Assert(all.Array("id"), g.Slice{1, 2, 3}) - t.Assert(all.Array("nickname"), g.Slice{"name_1", "name_2", "name_3"}) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id", g.Slice{1, 2, 3}).All() + t.AssertNil(err) + t.Assert(all.Array("id"), g.Slice{1, 2, 3}) + t.Assert(all.Array("nickname"), g.Slice{"name_1", "name_2", "name_3"}) + }) - gtest.C(t, func(t *gtest.T) { - array, err := db.Model(table).Fields("nickname").Where("id", g.Slice{1, 2, 3}).Array() - t.AssertNil(err) - t.Assert(array, g.Slice{"name_1", "name_2", "name_3"}) - }) - gtest.C(t, func(t *gtest.T) { - array, err := db.Model(table).Array("nickname", "id", g.Slice{1, 2, 3}) - t.AssertNil(err) - t.Assert(array, g.Slice{"name_1", "name_2", "name_3"}) - }) + gtest.C(t, func(t *gtest.T) { + array, err := db.Model(table).Fields("nickname").Where("id", g.Slice{1, 2, 3}).Array() + t.AssertNil(err) + t.Assert(array, g.Slice{"name_1", "name_2", "name_3"}) + }) + gtest.C(t, func(t *gtest.T) { + array, err := db.Model(table).Array("nickname", "id", g.Slice{1, 2, 3}) + t.AssertNil(err) + t.Assert(array, g.Slice{"name_1", "name_2", "name_3"}) + }) } func Test_Model_Count(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - // Count with cache, check internal ctx data feature. - gtest.C(t, func(t *gtest.T) { - for i := 0; i < 10; i++ { - count, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Name: guid.S(), - Force: false, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - } - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).FieldsEx("id").Where("id>8").Count() - t.AssertNil(err) - t.Assert(count, int64(2)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Fields("distinct id,nickname").Where("id>8").Count() - t.AssertNil(err) - t.Assert(count, int64(2)) - }) - // COUNT...LIMIT... - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Page(1, 2).Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + // Count with cache, check internal ctx data feature. + gtest.C(t, func(t *gtest.T) { + for i := 0; i < 10; i++ { + count, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Name: guid.S(), + Force: false, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + } + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).FieldsEx("id").Where("id>8").Count() + t.AssertNil(err) + t.Assert(count, int64(2)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Fields("distinct id,nickname").Where("id>8").Count() + t.AssertNil(err) + t.Assert(count, int64(2)) + }) + // COUNT...LIMIT... + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Page(1, 2).Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) } func Test_Model_Exist(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - exist, err := db.Model(table).Exist() - t.AssertNil(err) - t.Assert(exist, TableSize > 0) - exist, err = db.Model(table).Where("id", -1).Exist() - t.AssertNil(err) - t.Assert(exist, false) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + exist, err := db.Model(table).Exist() + t.AssertNil(err) + t.Assert(exist, TableSize > 0) + exist, err = db.Model(table).Where("id", -1).Exist() + t.AssertNil(err) + t.Assert(exist, false) + }) } func Test_Model_Value_WithCache(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Value() - t.AssertNil(err) - t.Assert(value.Int(), 0) - }) - return - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.MapStrAny{ - "id": 1, - "passport": fmt.Sprintf(`passport_%d`, 1), - "password": fmt.Sprintf(`password_%d`, 1), - "nickname": fmt.Sprintf(`nickname_%d`, 1), - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Value("id") - t.AssertNil(err) - t.Assert(value.Int(), 1) - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Value() + t.AssertNil(err) + t.Assert(value.Int(), 0) + }) + return + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.MapStrAny{ + "id": 1, + "passport": fmt.Sprintf(`passport_%d`, 1), + "password": fmt.Sprintf(`password_%d`, 1), + "nickname": fmt.Sprintf(`nickname_%d`, 1), + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Value("id") + t.AssertNil(err) + t.Assert(value.Int(), 1) + }) } func Test_Model_Count_WithCache(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.MapStrAny{ - "id": 1, - "passport": fmt.Sprintf(`passport_%d`, 1), - "password": fmt.Sprintf(`password_%d`, 1), - "nickname": fmt.Sprintf(`nickname_%d`, 1), - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(1)) - }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.MapStrAny{ + "id": 1, + "passport": fmt.Sprintf(`passport_%d`, 1), + "password": fmt.Sprintf(`password_%d`, 1), + "nickname": fmt.Sprintf(`nickname_%d`, 1), + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(1)) + }) } func Test_Model_Count_All_WithCache(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.MapStrAny{ - "id": 1, - "passport": fmt.Sprintf(`passport_%d`, 1), - "password": fmt.Sprintf(`password_%d`, 1), - "nickname": fmt.Sprintf(`nickname_%d`, 1), - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(1)) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.MapStrAny{ - "id": 2, - "passport": fmt.Sprintf(`passport_%d`, 2), - "password": fmt.Sprintf(`password_%d`, 2), - "nickname": fmt.Sprintf(`nickname_%d`, 2), - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(1)) - }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.MapStrAny{ + "id": 1, + "passport": fmt.Sprintf(`passport_%d`, 1), + "password": fmt.Sprintf(`password_%d`, 1), + "nickname": fmt.Sprintf(`nickname_%d`, 1), + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(1)) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.MapStrAny{ + "id": 2, + "passport": fmt.Sprintf(`passport_%d`, 2), + "password": fmt.Sprintf(`password_%d`, 2), + "nickname": fmt.Sprintf(`nickname_%d`, 2), + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(1)) + }) } func Test_Model_CountColumn_WithCache(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).CountColumn("id") - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.MapStrAny{ - "id": 1, - "passport": fmt.Sprintf(`passport_%d`, 1), - "password": fmt.Sprintf(`password_%d`, 1), - "nickname": fmt.Sprintf(`nickname_%d`, 1), - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).CountColumn("id") - t.AssertNil(err) - t.Assert(count, int64(1)) - }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).CountColumn("id") + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.MapStrAny{ + "id": 1, + "passport": fmt.Sprintf(`passport_%d`, 1), + "password": fmt.Sprintf(`password_%d`, 1), + "nickname": fmt.Sprintf(`nickname_%d`, 1), + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).CountColumn("id") + t.AssertNil(err) + t.Assert(count, int64(1)) + }) } func Test_Model_Select(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime gtime.Time - } - gtest.C(t, func(t *gtest.T) { - var users []User - err := db.Model(table).Scan(&users) - t.AssertNil(err) - t.Assert(len(users), TableSize) - }) + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime gtime.Time + } + gtest.C(t, func(t *gtest.T) { + var users []User + err := db.Model(table).Scan(&users) + t.AssertNil(err) + t.Assert(len(users), TableSize) + }) } func Test_Model_Struct(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime gtime.Time - } - user := new(User) - err := db.Model(table).Where("id=1").Scan(user) - t.AssertNil(err) - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - user := new(User) - err := db.Model(table).Where("id=1").Scan(user) - t.AssertNil(err) - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) - // Auto creating struct object. - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - user := (*User)(nil) - err := db.Model(table).Where("id=1").Scan(&user) - t.AssertNil(err) - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) - // Just using Scan. - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - user := (*User)(nil) - err := db.Model(table).Where("id=1").Scan(&user) - if err != nil { - gtest.Error(err) - } - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) - // sql.ErrNoRows - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - user := new(User) - err := db.Model(table).Where("id=-1").Scan(user) - t.Assert(err, sql.ErrNoRows) - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - var user *User - err := db.Model(table).Where("id=-1").Scan(&user) - t.AssertNil(err) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime gtime.Time + } + user := new(User) + err := db.Model(table).Where("id=1").Scan(user) + t.AssertNil(err) + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + user := new(User) + err := db.Model(table).Where("id=1").Scan(user) + t.AssertNil(err) + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) + // Auto creating struct object. + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + user := (*User)(nil) + err := db.Model(table).Where("id=1").Scan(&user) + t.AssertNil(err) + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) + // Just using Scan. + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + user := (*User)(nil) + err := db.Model(table).Where("id=1").Scan(&user) + if err != nil { + gtest.Error(err) + } + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) + // sql.ErrNoRows + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + user := new(User) + err := db.Model(table).Where("id=-1").Scan(user) + t.Assert(err, sql.ErrNoRows) + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + var user *User + err := db.Model(table).Where("id=-1").Scan(&user) + t.AssertNil(err) + }) } func Test_Model_Struct_CustomType(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type MyInt int + type MyInt int - gtest.C(t, func(t *gtest.T) { - type User struct { - Id MyInt - Passport string - Password string - NickName string - CreateTime gtime.Time - } - user := new(User) - err := db.Model(table).Where("id=1").Scan(user) - t.AssertNil(err) - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id MyInt + Passport string + Password string + NickName string + CreateTime gtime.Time + } + user := new(User) + err := db.Model(table).Where("id=1").Scan(user) + t.AssertNil(err) + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) } func Test_Model_Structs(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime gtime.Time - } - var users []User - err := db.Model(table).Order("id asc").Scan(&users) - if err != nil { - gtest.Error(err) - } - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[1].Id, 2) - t.Assert(users[2].Id, 3) - t.Assert(users[0].NickName, "name_1") - t.Assert(users[1].NickName, "name_2") - t.Assert(users[2].NickName, "name_3") - t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") - }) - // Auto create struct slice. - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - var users []*User - err := db.Model(table).Order("id asc").Scan(&users) - if err != nil { - gtest.Error(err) - } - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[1].Id, 2) - t.Assert(users[2].Id, 3) - t.Assert(users[0].NickName, "name_1") - t.Assert(users[1].NickName, "name_2") - t.Assert(users[2].NickName, "name_3") - t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") - }) - // Just using Scan. - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - var users []*User - err := db.Model(table).Order("id asc").Scan(&users) - if err != nil { - gtest.Error(err) - } - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[1].Id, 2) - t.Assert(users[2].Id, 3) - t.Assert(users[0].NickName, "name_1") - t.Assert(users[1].NickName, "name_2") - t.Assert(users[2].NickName, "name_3") - t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") - }) - // sql.ErrNoRows - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - var users []*User - err := db.Model(table).Where("id<0").Scan(&users) - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime gtime.Time + } + var users []User + err := db.Model(table).Order("id asc").Scan(&users) + if err != nil { + gtest.Error(err) + } + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[1].Id, 2) + t.Assert(users[2].Id, 3) + t.Assert(users[0].NickName, "name_1") + t.Assert(users[1].NickName, "name_2") + t.Assert(users[2].NickName, "name_3") + t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") + }) + // Auto create struct slice. + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + var users []*User + err := db.Model(table).Order("id asc").Scan(&users) + if err != nil { + gtest.Error(err) + } + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[1].Id, 2) + t.Assert(users[2].Id, 3) + t.Assert(users[0].NickName, "name_1") + t.Assert(users[1].NickName, "name_2") + t.Assert(users[2].NickName, "name_3") + t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") + }) + // Just using Scan. + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + var users []*User + err := db.Model(table).Order("id asc").Scan(&users) + if err != nil { + gtest.Error(err) + } + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[1].Id, 2) + t.Assert(users[2].Id, 3) + t.Assert(users[0].NickName, "name_1") + t.Assert(users[1].NickName, "name_2") + t.Assert(users[2].NickName, "name_3") + t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") + }) + // sql.ErrNoRows + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + var users []*User + err := db.Model(table).Where("id<0").Scan(&users) + t.AssertNil(err) + }) } func Test_Model_StructsWithOrmTag(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - dbInvalid.SetDebug(true) - defer dbInvalid.SetDebug(false) - gtest.C(t, func(t *gtest.T) { - type User struct { - Uid int `orm:"id"` - Passport string - Password string `orm:"password"` - Name string `orm:"nick_name"` - Time gtime.Time `orm:"create_time"` - } - var ( - users []User - buffer = bytes.NewBuffer(nil) - ) - dbInvalid.GetLogger().(*glog.Logger).SetWriter(buffer) - defer dbInvalid.GetLogger().(*glog.Logger).SetWriter(os.Stdout) - dbInvalid.Model(table).Order("id asc").Scan(&users) - // fmt.Println(buffer.String()) - t.Assert( - gstr.Contains( - buffer.String(), - "SELECT `id`,`Passport`,`password`,`nick_name`,`create_time` FROM `user", - ), - true, - ) - }) + dbInvalid.SetDebug(true) + defer dbInvalid.SetDebug(false) + gtest.C(t, func(t *gtest.T) { + type User struct { + Uid int `orm:"id"` + Passport string + Password string `orm:"password"` + Name string `orm:"nick_name"` + Time gtime.Time `orm:"create_time"` + } + var ( + users []User + buffer = bytes.NewBuffer(nil) + ) + dbInvalid.GetLogger().(*glog.Logger).SetWriter(buffer) + defer dbInvalid.GetLogger().(*glog.Logger).SetWriter(os.Stdout) + dbInvalid.Model(table).Order("id asc").Scan(&users) + // fmt.Println(buffer.String()) + t.Assert( + gstr.Contains( + buffer.String(), + "SELECT `id`,`Passport`,`password`,`nick_name`,`create_time` FROM `user", + ), + true, + ) + }) - // db.SetDebug(true) - // defer db.SetDebug(false) - gtest.C(t, func(t *gtest.T) { - type A struct { - Passport string - Password string - } - type B struct { - A - NickName string - } - one, err := db.Model(table).Fields(&B{}).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 3) - t.Assert(one["nickname"], "name_2") - t.Assert(one["passport"], "user_2") - t.Assert(one["password"], "pass_2") - }) + // db.SetDebug(true) + // defer db.SetDebug(false) + gtest.C(t, func(t *gtest.T) { + type A struct { + Passport string + Password string + } + type B struct { + A + NickName string + } + one, err := db.Model(table).Fields(&B{}).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 3) + t.Assert(one["nickname"], "name_2") + t.Assert(one["passport"], "user_2") + t.Assert(one["password"], "pass_2") + }) } func Test_Model_Scan(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime gtime.Time - } - user := new(User) - err := db.Model(table).Where("id=1").Scan(user) - t.AssertNil(err) - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - user := new(User) - err := db.Model(table).Where("id=1").Scan(user) - t.AssertNil(err) - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime gtime.Time - } - var users []User - err := db.Model(table).Order("id asc").Scan(&users) - t.AssertNil(err) - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[1].Id, 2) - t.Assert(users[2].Id, 3) - t.Assert(users[0].NickName, "name_1") - t.Assert(users[1].NickName, "name_2") - t.Assert(users[2].NickName, "name_3") - t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - var users []*User - err := db.Model(table).Order("id asc").Scan(&users) - t.AssertNil(err) - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[1].Id, 2) - t.Assert(users[2].Id, 3) - t.Assert(users[0].NickName, "name_1") - t.Assert(users[1].NickName, "name_2") - t.Assert(users[2].NickName, "name_3") - t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") - }) - // sql.ErrNoRows - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - var ( - user = new(User) - users = new([]*User) - ) - err1 := db.Model(table).Where("id < 0").Scan(user) - err2 := db.Model(table).Where("id < 0").Scan(users) - t.Assert(err1, sql.ErrNoRows) - t.Assert(err2, nil) - }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime gtime.Time + } + user := new(User) + err := db.Model(table).Where("id=1").Scan(user) + t.AssertNil(err) + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + user := new(User) + err := db.Model(table).Where("id=1").Scan(user) + t.AssertNil(err) + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime gtime.Time + } + var users []User + err := db.Model(table).Order("id asc").Scan(&users) + t.AssertNil(err) + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[1].Id, 2) + t.Assert(users[2].Id, 3) + t.Assert(users[0].NickName, "name_1") + t.Assert(users[1].NickName, "name_2") + t.Assert(users[2].NickName, "name_3") + t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + var users []*User + err := db.Model(table).Order("id asc").Scan(&users) + t.AssertNil(err) + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[1].Id, 2) + t.Assert(users[2].Id, 3) + t.Assert(users[0].NickName, "name_1") + t.Assert(users[1].NickName, "name_2") + t.Assert(users[2].NickName, "name_3") + t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") + }) + // sql.ErrNoRows + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + var ( + user = new(User) + users = new([]*User) + ) + err1 := db.Model(table).Where("id < 0").Scan(user) + err2 := db.Model(table).Where("id < 0").Scan(users) + t.Assert(err1, sql.ErrNoRows) + t.Assert(err2, nil) + }) } func Test_Model_Scan_NilSliceAttrWhenNoRecordsFound(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime gtime.Time - } - type Response struct { - Users []User `json:"users"` - } - var res Response - err := db.Model(table).Scan(&res.Users) - t.AssertNil(err) - t.Assert(res.Users, nil) - }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime gtime.Time + } + type Response struct { + Users []User `json:"users"` + } + var res Response + err := db.Model(table).Scan(&res.Users) + t.AssertNil(err) + t.Assert(res.Users, nil) + }) } func Test_Model_OrderBy(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Order("id DESC").All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - t.Assert(result[0]["nickname"].String(), fmt.Sprintf("name_%d", TableSize)) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Order("id DESC").All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + t.Assert(result[0]["nickname"].String(), fmt.Sprintf("name_%d", TableSize)) + }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Order(gdb.Raw("NULL")).All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - t.Assert(result[0]["nickname"].String(), "name_1") - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Order(gdb.Raw("NULL")).All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + t.Assert(result[0]["nickname"].String(), "name_1") + }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Order(gdb.Raw("field(id, 10,1,2,3,4,5,6,7,8,9)")).All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - t.Assert(result[0]["nickname"].String(), "name_10") - t.Assert(result[1]["nickname"].String(), "name_1") - t.Assert(result[2]["nickname"].String(), "name_2") - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Order(gdb.Raw("field(id, 10,1,2,3,4,5,6,7,8,9)")).All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + t.Assert(result[0]["nickname"].String(), "name_10") + t.Assert(result[1]["nickname"].String(), "name_1") + t.Assert(result[2]["nickname"].String(), "name_2") + }) } func Test_Model_GroupBy(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Group("id").All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - t.Assert(result[0]["nickname"].String(), "name_1") - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Group("id").All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + t.Assert(result[0]["nickname"].String(), "name_1") + }) } func Test_Model_Data(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) - result, err := db.Model(table).Data("nickname=?", "test").Where("id=?", 3).Update() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - users := make([]g.MapStrAny, 0) - for i := 1; i <= 10; i++ { - users = append(users, g.MapStrAny{ - "id": i, - "passport": fmt.Sprintf(`passport_%d`, i), - "password": fmt.Sprintf(`password_%d`, i), - "nickname": fmt.Sprintf(`nickname_%d`, i), - }) - } - result, err := db.Model(table).Data(users).Batch(2).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 10) - }) - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - users := garray.New() - for i := 1; i <= 10; i++ { - users.Append(g.MapStrAny{ - "id": i, - "passport": fmt.Sprintf(`passport_%d`, i), - "password": fmt.Sprintf(`password_%d`, i), - "nickname": fmt.Sprintf(`nickname_%d`, i), - }) - } - result, err := db.Model(table).Data(users).Batch(2).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 10) - }) + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) + result, err := db.Model(table).Data("nickname=?", "test").Where("id=?", 3).Update() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + users := make([]g.MapStrAny, 0) + for i := 1; i <= 10; i++ { + users = append(users, g.MapStrAny{ + "id": i, + "passport": fmt.Sprintf(`passport_%d`, i), + "password": fmt.Sprintf(`password_%d`, i), + "nickname": fmt.Sprintf(`nickname_%d`, i), + }) + } + result, err := db.Model(table).Data(users).Batch(2).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 10) + }) + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + users := garray.New() + for i := 1; i <= 10; i++ { + users.Append(g.MapStrAny{ + "id": i, + "passport": fmt.Sprintf(`passport_%d`, i), + "password": fmt.Sprintf(`password_%d`, i), + "nickname": fmt.Sprintf(`nickname_%d`, i), + }) + } + result, err := db.Model(table).Data(users).Batch(2).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 10) + }) } func Test_Model_Delete(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - // DELETE...LIMIT - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where(1).Limit(2).Delete() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 2) - }) + // DELETE...LIMIT + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where(1).Limit(2).Delete() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 2) + }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where(1).Delete() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, TableSize-2) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where(1).Delete() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, TableSize-2) + }) } func Test_Model_Offset(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Limit(2).Offset(5).Order("id").All() - t.AssertNil(err) - t.Assert(len(result), 2) - t.Assert(result[0]["id"], 6) - t.Assert(result[1]["id"], 7) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Limit(2).Offset(5).Order("id").All() + t.AssertNil(err) + t.Assert(len(result), 2) + t.Assert(result[0]["id"], 6) + t.Assert(result[1]["id"], 7) + }) } func Test_Model_Page(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Page(3, 3).Order("id").All() - t.AssertNil(err) - t.Assert(len(result), 3) - t.Assert(result[0]["id"], 7) - t.Assert(result[1]["id"], 8) - }) - gtest.C(t, func(t *gtest.T) { - model := db.Model(table).Safe().Order("id") - all, err := model.Page(3, 3).All() - count, err := model.Count() - t.AssertNil(err) - t.Assert(len(all), 3) - t.Assert(all[0]["id"], "7") - t.Assert(count, int64(TableSize)) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Page(3, 3).Order("id").All() + t.AssertNil(err) + t.Assert(len(result), 3) + t.Assert(result[0]["id"], 7) + t.Assert(result[1]["id"], 8) + }) + gtest.C(t, func(t *gtest.T) { + model := db.Model(table).Safe().Order("id") + all, err := model.Page(3, 3).All() + count, err := model.Count() + t.AssertNil(err) + t.Assert(len(all), 3) + t.Assert(all[0]["id"], "7") + t.Assert(count, int64(TableSize)) + }) } func Test_Model_Option_Map(t *testing.T) { - // Insert - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - r, err := db.Model(table).Fields("id, passport").Data(g.Map{ - "id": 1, - "passport": "1", - "password": "1", - "nickname": "1", - }).Insert() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) - one, err := db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.AssertNE(one["password"].String(), "1") - t.AssertNE(one["nickname"].String(), "1") - t.Assert(one["passport"].String(), "1") - }) + // Insert + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + r, err := db.Model(table).Fields("id, passport").Data(g.Map{ + "id": 1, + "passport": "1", + "password": "1", + "nickname": "1", + }).Insert() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) + one, err := db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.AssertNE(one["password"].String(), "1") + t.AssertNE(one["nickname"].String(), "1") + t.Assert(one["passport"].String(), "1") + }) - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - r, err := db.Model(table).OmitEmptyData().Data(g.Map{ - "id": 1, - "passport": 0, - "password": 0, - "nickname": "1", - }).Insert() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) - one, err := db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.AssertNE(one["passport"].String(), "0") - t.AssertNE(one["password"].String(), "0") - t.Assert(one["nickname"].String(), "1") - }) + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + r, err := db.Model(table).OmitEmptyData().Data(g.Map{ + "id": 1, + "passport": 0, + "password": 0, + "nickname": "1", + }).Insert() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) + one, err := db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.AssertNE(one["passport"].String(), "0") + t.AssertNE(one["password"].String(), "0") + t.Assert(one["nickname"].String(), "1") + }) - // Replace - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) - _, err := db.Model(table).OmitEmptyData().Data(g.Map{ - "id": 1, - "passport": 0, - "password": 0, - "nickname": "1", - }).Replace() - t.AssertNil(err) - one, err := db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.AssertNE(one["passport"].String(), "0") - t.AssertNE(one["password"].String(), "0") - t.Assert(one["nickname"].String(), "1") - }) + // Replace + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) + _, err := db.Model(table).OmitEmptyData().Data(g.Map{ + "id": 1, + "passport": 0, + "password": 0, + "nickname": "1", + }).Replace() + t.AssertNil(err) + one, err := db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.AssertNE(one["passport"].String(), "0") + t.AssertNE(one["password"].String(), "0") + t.Assert(one["nickname"].String(), "1") + }) - // Save - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - r, err := db.Model(table).Fields("id, passport").Data(g.Map{ - "id": 1, - "passport": "1", - "password": "1", - "nickname": "1", - }).Save() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) - one, err := db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.AssertNE(one["password"].String(), "1") - t.AssertNE(one["nickname"].String(), "1") - t.Assert(one["passport"].String(), "1") - }) - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - _, err := db.Model(table).OmitEmptyData().Data(g.Map{ - "id": 1, - "passport": 0, - "password": 0, - "nickname": "1", - }).Save() - t.AssertNil(err) - one, err := db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.AssertNE(one["passport"].String(), "0") - t.AssertNE(one["password"].String(), "0") - t.Assert(one["nickname"].String(), "1") + // Save + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + r, err := db.Model(table).Fields("id, passport").Data(g.Map{ + "id": 1, + "passport": "1", + "password": "1", + "nickname": "1", + }).Save() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) + one, err := db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.AssertNE(one["password"].String(), "1") + t.AssertNE(one["nickname"].String(), "1") + t.Assert(one["passport"].String(), "1") + }) + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + _, err := db.Model(table).OmitEmptyData().Data(g.Map{ + "id": 1, + "passport": 0, + "password": 0, + "nickname": "1", + }).Save() + t.AssertNil(err) + one, err := db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.AssertNE(one["passport"].String(), "0") + t.AssertNE(one["password"].String(), "0") + t.Assert(one["nickname"].String(), "1") - _, err = db.Model(table).Data(g.Map{ - "id": 1, - "passport": 0, - "password": 0, - "nickname": "1", - }).Save() - t.AssertNil(err) - one, err = db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.Assert(one["passport"].String(), "0") - t.Assert(one["password"].String(), "0") - t.Assert(one["nickname"].String(), "1") - }) + _, err = db.Model(table).Data(g.Map{ + "id": 1, + "passport": 0, + "password": 0, + "nickname": "1", + }).Save() + t.AssertNil(err) + one, err = db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.Assert(one["passport"].String(), "0") + t.Assert(one["password"].String(), "0") + t.Assert(one["nickname"].String(), "1") + }) - // Update - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) + // Update + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) - r, err := db.Model(table).Data(g.Map{"nickname": ""}).Where("id", 1).Update() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + r, err := db.Model(table).Data(g.Map{"nickname": ""}).Where("id", 1).Update() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - _, err = db.Model(table).OmitEmptyData().Data(g.Map{"nickname": ""}).Where("id", 2).Update() - t.AssertNE(err, nil) + _, err = db.Model(table).OmitEmptyData().Data(g.Map{"nickname": ""}).Where("id", 2).Update() + t.AssertNE(err, nil) - r, err = db.Model(table).OmitEmpty().Data(g.Map{"nickname": "", "password": "123"}).Where("id", 3).Update() - t.AssertNil(err) - n, _ = r.RowsAffected() - t.Assert(n, 1) + r, err = db.Model(table).OmitEmpty().Data(g.Map{"nickname": "", "password": "123"}).Where("id", 3).Update() + t.AssertNil(err) + n, _ = r.RowsAffected() + t.Assert(n, 1) - _, err = db.Model(table).OmitEmpty().Fields("nickname").Data(g.Map{"nickname": "", "password": "123"}).Where("id", 4).Update() - t.AssertNE(err, nil) + _, err = db.Model(table).OmitEmpty().Fields("nickname").Data(g.Map{"nickname": "", "password": "123"}).Where("id", 4).Update() + t.AssertNE(err, nil) - r, err = db.Model(table).OmitEmpty(). - Fields("password").Data(g.Map{ - "nickname": "", - "passport": "123", - "password": "456", - }).Where("id", 5).Update() - t.AssertNil(err) - n, _ = r.RowsAffected() - t.Assert(n, 1) + r, err = db.Model(table).OmitEmpty(). + Fields("password").Data(g.Map{ + "nickname": "", + "passport": "123", + "password": "456", + }).Where("id", 5).Update() + t.AssertNil(err) + n, _ = r.RowsAffected() + t.Assert(n, 1) - one, err := db.Model(table).Where("id", 5).One() - t.AssertNil(err) - t.Assert(one["password"], "456") - t.AssertNE(one["passport"].String(), "") - t.AssertNE(one["passport"].String(), "123") - }) + one, err := db.Model(table).Where("id", 5).One() + t.AssertNil(err) + t.Assert(one["password"], "456") + t.AssertNE(one["passport"].String(), "") + t.AssertNE(one["passport"].String(), "123") + }) } func Test_Model_Option_List(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - r, err := db.Model(table).Fields("id, password").Data(g.List{ - g.Map{ - "id": 1, - "passport": "1", - "password": "1", - "nickname": "1", - }, - g.Map{ - "id": 2, - "passport": "2", - "password": "2", - "nickname": "2", - }, - }).Save() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 2) - list, err := db.Model(table).Order("id asc").All() - t.AssertNil(err) - t.Assert(len(list), 2) - t.Assert(list[0]["id"].String(), "1") - t.Assert(list[0]["nickname"].String(), "") - t.Assert(list[0]["passport"].String(), "") - t.Assert(list[0]["password"].String(), "1") + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + r, err := db.Model(table).Fields("id, password").Data(g.List{ + g.Map{ + "id": 1, + "passport": "1", + "password": "1", + "nickname": "1", + }, + g.Map{ + "id": 2, + "passport": "2", + "password": "2", + "nickname": "2", + }, + }).Save() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 2) + list, err := db.Model(table).Order("id asc").All() + t.AssertNil(err) + t.Assert(len(list), 2) + t.Assert(list[0]["id"].String(), "1") + t.Assert(list[0]["nickname"].String(), "") + t.Assert(list[0]["passport"].String(), "") + t.Assert(list[0]["password"].String(), "1") - t.Assert(list[1]["id"].String(), "2") - t.Assert(list[1]["nickname"].String(), "") - t.Assert(list[1]["passport"].String(), "") - t.Assert(list[1]["password"].String(), "2") - }) + t.Assert(list[1]["id"].String(), "2") + t.Assert(list[1]["nickname"].String(), "") + t.Assert(list[1]["passport"].String(), "") + t.Assert(list[1]["password"].String(), "2") + }) - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - r, err := db.Model(table).OmitEmpty().Fields("id, password").Data(g.List{ - g.Map{ - "id": 1, - "passport": "1", - "password": 0, - "nickname": "1", - }, - g.Map{ - "id": 2, - "passport": "2", - "password": "2", - "nickname": "2", - }, - }).Save() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 2) - list, err := db.Model(table).Order("id asc").All() - t.AssertNil(err) - t.Assert(len(list), 2) - t.Assert(list[0]["id"].String(), "1") - t.Assert(list[0]["nickname"].String(), "") - t.Assert(list[0]["passport"].String(), "") - t.Assert(list[0]["password"].String(), "0") + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + r, err := db.Model(table).OmitEmpty().Fields("id, password").Data(g.List{ + g.Map{ + "id": 1, + "passport": "1", + "password": 0, + "nickname": "1", + }, + g.Map{ + "id": 2, + "passport": "2", + "password": "2", + "nickname": "2", + }, + }).Save() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 2) + list, err := db.Model(table).Order("id asc").All() + t.AssertNil(err) + t.Assert(len(list), 2) + t.Assert(list[0]["id"].String(), "1") + t.Assert(list[0]["nickname"].String(), "") + t.Assert(list[0]["passport"].String(), "") + t.Assert(list[0]["password"].String(), "0") - t.Assert(list[1]["id"].String(), "2") - t.Assert(list[1]["nickname"].String(), "") - t.Assert(list[1]["passport"].String(), "") - t.Assert(list[1]["password"].String(), "2") - }) + t.Assert(list[1]["id"].String(), "2") + t.Assert(list[1]["nickname"].String(), "") + t.Assert(list[1]["passport"].String(), "") + t.Assert(list[1]["password"].String(), "2") + }) } func Test_Model_OmitEmpty(t *testing.T) { - table := fmt.Sprintf(`table_%s`, gtime.TimestampNanoStr()) - if _, err := db.Exec(ctx, fmt.Sprintf(` + table := fmt.Sprintf(`table_%s`, gtime.TimestampNanoStr()) + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE IF NOT EXISTS %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(45) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table)); err != nil { - gtest.Error(err) - } - defer dropTable(table) + gtest.Error(err) + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).OmitEmpty().Data(g.Map{ - "id": 1, - "name": "", - }).Save() - t.AssertNE(err, nil) - }) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).OmitEmptyData().Data(g.Map{ - "id": 1, - "name": "", - }).Save() - t.AssertNE(err, nil) - }) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).OmitEmptyWhere().Data(g.Map{ - "id": 1, - "name": "", - }).Save() - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).OmitEmpty().Data(g.Map{ + "id": 1, + "name": "", + }).Save() + t.AssertNE(err, nil) + }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).OmitEmptyData().Data(g.Map{ + "id": 1, + "name": "", + }).Save() + t.AssertNE(err, nil) + }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).OmitEmptyWhere().Data(g.Map{ + "id": 1, + "name": "", + }).Save() + t.AssertNil(err) + }) } func Test_Model_OmitNil(t *testing.T) { - table := fmt.Sprintf(`table_%s`, gtime.TimestampNanoStr()) - if _, err := db.Exec(ctx, fmt.Sprintf(` + table := fmt.Sprintf(`table_%s`, gtime.TimestampNanoStr()) + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE IF NOT EXISTS %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(45) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table)); err != nil { - gtest.Error(err) - } - defer dropTable(table) + gtest.Error(err) + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).OmitNil().Data(g.Map{ - "id": 1, - "name": nil, - }).Save() - t.AssertNE(err, nil) - }) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).OmitNil().Data(g.Map{ - "id": 1, - "name": "", - }).Save() - t.AssertNil(err) - }) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).OmitNilWhere().Data(g.Map{ - "id": 1, - "name": "", - }).Save() - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).OmitNil().Data(g.Map{ + "id": 1, + "name": nil, + }).Save() + t.AssertNE(err, nil) + }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).OmitNil().Data(g.Map{ + "id": 1, + "name": "", + }).Save() + t.AssertNil(err) + }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).OmitNilWhere().Data(g.Map{ + "id": 1, + "name": "", + }).Save() + t.AssertNil(err) + }) } func Test_Model_FieldsEx(t *testing.T) { - table := createInitTable() - defer dropTable(table) - // Select. - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table).FieldsEx("create_time, id").Where("id in (?)", g.Slice{1, 2}).Order("id asc").All() - t.AssertNil(err) - t.Assert(len(r), 2) - t.Assert(len(r[0]), 4) - t.Assert(r[0]["id"], "") - t.Assert(r[0]["passport"], "user_1") - t.Assert(r[0]["password"], "pass_1") - t.Assert(r[0]["nickname"], "name_1") - t.Assert(r[0]["create_time"], "") - t.Assert(r[1]["id"], "") - t.Assert(r[1]["passport"], "user_2") - t.Assert(r[1]["password"], "pass_2") - t.Assert(r[1]["nickname"], "name_2") - t.Assert(r[1]["create_time"], "") - }) - // Update. - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table).FieldsEx("password").Data(g.Map{"nickname": "123", "password": "456"}).Where("id", 3).Update() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + table := createInitTable() + defer dropTable(table) + // Select. + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table).FieldsEx("create_time, id").Where("id in (?)", g.Slice{1, 2}).Order("id asc").All() + t.AssertNil(err) + t.Assert(len(r), 2) + t.Assert(len(r[0]), 4) + t.Assert(r[0]["id"], "") + t.Assert(r[0]["passport"], "user_1") + t.Assert(r[0]["password"], "pass_1") + t.Assert(r[0]["nickname"], "name_1") + t.Assert(r[0]["create_time"], "") + t.Assert(r[1]["id"], "") + t.Assert(r[1]["passport"], "user_2") + t.Assert(r[1]["password"], "pass_2") + t.Assert(r[1]["nickname"], "name_2") + t.Assert(r[1]["create_time"], "") + }) + // Update. + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table).FieldsEx("password").Data(g.Map{"nickname": "123", "password": "456"}).Where("id", 3).Update() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - one, err := db.Model(table).Where("id", 3).One() - t.AssertNil(err) - t.Assert(one["nickname"], "123") - t.AssertNE(one["password"], "456") - }) + one, err := db.Model(table).Where("id", 3).One() + t.AssertNil(err) + t.Assert(one["nickname"], "123") + t.AssertNE(one["password"], "456") + }) } func Test_Model_FieldsEx_WithReservedWords(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - var ( - table = "fieldsex_test_table" - sqlTpcPath = gtest.DataPath("reservedwords_table_tpl.sql") - sqlContent = gfile.GetContents(sqlTpcPath) - ) - t.AssertNE(sqlContent, "") - if _, err := db.Exec(ctx, fmt.Sprintf(sqlContent, table)); err != nil { - t.AssertNil(err) - } - defer dropTable(table) - _, err := db.Model(table).FieldsEx("content").One() - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + var ( + table = "fieldsex_test_table" + sqlTpcPath = gtest.DataPath("reservedwords_table_tpl.sql") + sqlContent = gfile.GetContents(sqlTpcPath) + ) + t.AssertNE(sqlContent, "") + if _, err := db.Exec(ctx, fmt.Sprintf(sqlContent, table)); err != nil { + t.AssertNil(err) + } + defer dropTable(table) + _, err := db.Model(table).FieldsEx("content").One() + t.AssertNil(err) + }) } func Test_Model_Prefix(t *testing.T) { - db := dbPrefix - table := fmt.Sprintf(`%s_%d`, TableName, gtime.TimestampNano()) - createInitTableWithDb(db, TableNamePrefix1+table) - defer dropTable(TableNamePrefix1 + table) - // Select. - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table).Where("id in (?)", g.Slice{1, 2}).Order("id asc").All() - t.AssertNil(err) - t.Assert(len(r), 2) - t.Assert(r[0]["id"], "1") - t.Assert(r[1]["id"], "2") - }) - // Select with alias. - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table+" as u").Where("u.id in (?)", g.Slice{1, 2}).Order("u.id asc").All() - t.AssertNil(err) - t.Assert(len(r), 2) - t.Assert(r[0]["id"], "1") - t.Assert(r[1]["id"], "2") - }) - // Select with alias to struct. - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - } - var users []User - err := db.Model(table+" u").Where("u.id in (?)", g.Slice{1, 5}).Order("u.id asc").Scan(&users) - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(users[0].Id, 1) - t.Assert(users[1].Id, 5) - }) - // Select with alias and join statement. - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table+" as u1").LeftJoin(table+" as u2", "u2.id=u1.id").Where("u1.id in (?)", g.Slice{1, 2}).Order("u1.id asc").All() - t.AssertNil(err) - t.Assert(len(r), 2) - t.Assert(r[0]["id"], "1") - t.Assert(r[1]["id"], "2") - }) - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table).As("u1").LeftJoin(table+" as u2", "u2.id=u1.id").Where("u1.id in (?)", g.Slice{1, 2}).Order("u1.id asc").All() - t.AssertNil(err) - t.Assert(len(r), 2) - t.Assert(r[0]["id"], "1") - t.Assert(r[1]["id"], "2") - }) + db := dbPrefix + table := fmt.Sprintf(`%s_%d`, TableName, gtime.TimestampNano()) + createInitTableWithDb(db, TableNamePrefix1+table) + defer dropTable(TableNamePrefix1 + table) + // Select. + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table).Where("id in (?)", g.Slice{1, 2}).Order("id asc").All() + t.AssertNil(err) + t.Assert(len(r), 2) + t.Assert(r[0]["id"], "1") + t.Assert(r[1]["id"], "2") + }) + // Select with alias. + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table+" as u").Where("u.id in (?)", g.Slice{1, 2}).Order("u.id asc").All() + t.AssertNil(err) + t.Assert(len(r), 2) + t.Assert(r[0]["id"], "1") + t.Assert(r[1]["id"], "2") + }) + // Select with alias to struct. + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + } + var users []User + err := db.Model(table+" u").Where("u.id in (?)", g.Slice{1, 5}).Order("u.id asc").Scan(&users) + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(users[0].Id, 1) + t.Assert(users[1].Id, 5) + }) + // Select with alias and join statement. + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table+" as u1").LeftJoin(table+" as u2", "u2.id=u1.id").Where("u1.id in (?)", g.Slice{1, 2}).Order("u1.id asc").All() + t.AssertNil(err) + t.Assert(len(r), 2) + t.Assert(r[0]["id"], "1") + t.Assert(r[1]["id"], "2") + }) + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table).As("u1").LeftJoin(table+" as u2", "u2.id=u1.id").Where("u1.id in (?)", g.Slice{1, 2}).Order("u1.id asc").All() + t.AssertNil(err) + t.Assert(len(r), 2) + t.Assert(r[0]["id"], "1") + t.Assert(r[1]["id"], "2") + }) } func Test_Model_Schema1(t *testing.T) { - // db.SetDebug(true) + // db.SetDebug(true) - db = db.Schema(TestSchema1) - table := fmt.Sprintf(`%s_%s`, TableName, gtime.TimestampNanoStr()) - createInitTableWithDb(db, table) - db = db.Schema(TestSchema2) - createInitTableWithDb(db, table) - defer func() { - db = db.Schema(TestSchema1) - dropTableWithDb(db, table) - db = db.Schema(TestSchema2) - dropTableWithDb(db, table) - db = db.Schema(TestSchema1) - }() - // Method. - gtest.C(t, func(t *gtest.T) { - db = db.Schema(TestSchema1) - r, err := db.Model(table).Update(g.Map{"nickname": "name_100"}, "id=1") - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + db = db.Schema(TestSchema1) + table := fmt.Sprintf(`%s_%s`, TableName, gtime.TimestampNanoStr()) + createInitTableWithDb(db, table) + db = db.Schema(TestSchema2) + createInitTableWithDb(db, table) + defer func() { + db = db.Schema(TestSchema1) + dropTableWithDb(db, table) + db = db.Schema(TestSchema2) + dropTableWithDb(db, table) + db = db.Schema(TestSchema1) + }() + // Method. + gtest.C(t, func(t *gtest.T) { + db = db.Schema(TestSchema1) + r, err := db.Model(table).Update(g.Map{"nickname": "name_100"}, "id=1") + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - v, err := db.Model(table).Value("nickname", "id=1") - t.AssertNil(err) - t.Assert(v.String(), "name_100") + v, err := db.Model(table).Value("nickname", "id=1") + t.AssertNil(err) + t.Assert(v.String(), "name_100") - db = db.Schema(TestSchema2) - v, err = db.Model(table).Value("nickname", "id=1") - t.AssertNil(err) - t.Assert(v.String(), "name_1") - }) - // Model. - gtest.C(t, func(t *gtest.T) { - v, err := db.Model(table).Schema(TestSchema1).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_2") + db = db.Schema(TestSchema2) + v, err = db.Model(table).Value("nickname", "id=1") + t.AssertNil(err) + t.Assert(v.String(), "name_1") + }) + // Model. + gtest.C(t, func(t *gtest.T) { + v, err := db.Model(table).Schema(TestSchema1).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_2") - r, err := db.Model(table).Schema(TestSchema1).Update(g.Map{"nickname": "name_200"}, "id=2") - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + r, err := db.Model(table).Schema(TestSchema1).Update(g.Map{"nickname": "name_200"}, "id=2") + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - v, err = db.Model(table).Schema(TestSchema1).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_200") + v, err = db.Model(table).Schema(TestSchema1).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_200") - v, err = db.Model(table).Schema(TestSchema2).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_2") + v, err = db.Model(table).Schema(TestSchema2).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_2") - v, err = db.Model(table).Schema(TestSchema1).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_200") - }) - // Model. - gtest.C(t, func(t *gtest.T) { - i := 1000 - _, err := db.Model(table).Schema(TestSchema1).Insert(g.Map{ - "id": i, - "passport": fmt.Sprintf(`user_%d`, i), - "password": fmt.Sprintf(`pass_%d`, i), - "nickname": fmt.Sprintf(`name_%d`, i), - "create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(), - "none-exist-field": 1, - }) - t.AssertNil(err) + v, err = db.Model(table).Schema(TestSchema1).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_200") + }) + // Model. + gtest.C(t, func(t *gtest.T) { + i := 1000 + _, err := db.Model(table).Schema(TestSchema1).Insert(g.Map{ + "id": i, + "passport": fmt.Sprintf(`user_%d`, i), + "password": fmt.Sprintf(`pass_%d`, i), + "nickname": fmt.Sprintf(`name_%d`, i), + "create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(), + "none-exist-field": 1, + }) + t.AssertNil(err) - v, err := db.Model(table).Schema(TestSchema1).Value("nickname", "id=?", i) - t.AssertNil(err) - t.Assert(v.String(), "name_1000") + v, err := db.Model(table).Schema(TestSchema1).Value("nickname", "id=?", i) + t.AssertNil(err) + t.Assert(v.String(), "name_1000") - v, err = db.Model(table).Schema(TestSchema2).Value("nickname", "id=?", i) - t.AssertNil(err) - t.Assert(v.String(), "") - }) + v, err = db.Model(table).Schema(TestSchema2).Value("nickname", "id=?", i) + t.AssertNil(err) + t.Assert(v.String(), "") + }) } func Test_Model_Schema2(t *testing.T) { - // db.SetDebug(true) + // db.SetDebug(true) - db = db.Schema(TestSchema1) - table := fmt.Sprintf(`%s_%s`, TableName, gtime.TimestampNanoStr()) - createInitTableWithDb(db, table) - db = db.Schema(TestSchema2) - createInitTableWithDb(db, table) - defer func() { - db = db.Schema(TestSchema1) - dropTableWithDb(db, table) - db = db.Schema(TestSchema2) - dropTableWithDb(db, table) + db = db.Schema(TestSchema1) + table := fmt.Sprintf(`%s_%s`, TableName, gtime.TimestampNanoStr()) + createInitTableWithDb(db, table) + db = db.Schema(TestSchema2) + createInitTableWithDb(db, table) + defer func() { + db = db.Schema(TestSchema1) + dropTableWithDb(db, table) + db = db.Schema(TestSchema2) + dropTableWithDb(db, table) - db = db.Schema(TestSchema1) - }() - // Schema. - gtest.C(t, func(t *gtest.T) { - v, err := db.Schema(TestSchema1).Model(table).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_2") + db = db.Schema(TestSchema1) + }() + // Schema. + gtest.C(t, func(t *gtest.T) { + v, err := db.Schema(TestSchema1).Model(table).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_2") - r, err := db.Schema(TestSchema1).Model(table).Update(g.Map{"nickname": "name_200"}, "id=2") - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + r, err := db.Schema(TestSchema1).Model(table).Update(g.Map{"nickname": "name_200"}, "id=2") + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - v, err = db.Schema(TestSchema1).Model(table).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_200") + v, err = db.Schema(TestSchema1).Model(table).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_200") - v, err = db.Schema(TestSchema2).Model(table).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_2") + v, err = db.Schema(TestSchema2).Model(table).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_2") - v, err = db.Schema(TestSchema1).Model(table).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_200") - }) - // Schema. - gtest.C(t, func(t *gtest.T) { - i := 1000 - _, err := db.Schema(TestSchema1).Model(table).Insert(g.Map{ - "id": i, - "passport": fmt.Sprintf(`user_%d`, i), - "password": fmt.Sprintf(`pass_%d`, i), - "nickname": fmt.Sprintf(`name_%d`, i), - "create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(), - "none-exist-field": 1, - }) - t.AssertNil(err) + v, err = db.Schema(TestSchema1).Model(table).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_200") + }) + // Schema. + gtest.C(t, func(t *gtest.T) { + i := 1000 + _, err := db.Schema(TestSchema1).Model(table).Insert(g.Map{ + "id": i, + "passport": fmt.Sprintf(`user_%d`, i), + "password": fmt.Sprintf(`pass_%d`, i), + "nickname": fmt.Sprintf(`name_%d`, i), + "create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(), + "none-exist-field": 1, + }) + t.AssertNil(err) - v, err := db.Schema(TestSchema1).Model(table).Value("nickname", "id=?", i) - t.AssertNil(err) - t.Assert(v.String(), "name_1000") + v, err := db.Schema(TestSchema1).Model(table).Value("nickname", "id=?", i) + t.AssertNil(err) + t.Assert(v.String(), "name_1000") - v, err = db.Schema(TestSchema2).Model(table).Value("nickname", "id=?", i) - t.AssertNil(err) - t.Assert(v.String(), "") - }) + v, err = db.Schema(TestSchema2).Model(table).Value("nickname", "id=?", i) + t.AssertNil(err) + t.Assert(v.String(), "") + }) } func Test_Model_FieldsExStruct(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int `orm:"id" json:"id"` - Passport string `orm:"password" json:"pass_port"` - Password string `orm:"password" json:"password"` - NickName string `orm:"nickname" json:"nick__name"` - } - user := &User{ - Id: 1, - Passport: "111", - Password: "222", - NickName: "333", - } - r, err := db.Model(table).FieldsEx("create_time, password").OmitEmpty().Data(user).Insert() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int `orm:"id" json:"id"` - Passport string `orm:"password" json:"pass_port"` - Password string `orm:"password" json:"password"` - NickName string `orm:"nickname" json:"nick__name"` - } - users := make([]*User, 0) - for i := 100; i < 110; i++ { - users = append(users, &User{ - Id: i, - Passport: fmt.Sprintf(`passport_%d`, i), - Password: fmt.Sprintf(`password_%d`, i), - NickName: fmt.Sprintf(`nickname_%d`, i), - }) - } - r, err := db.Model(table).FieldsEx("create_time, password"). - OmitEmpty(). - Batch(2). - Data(users). - Insert() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 10) - }) + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int `orm:"id" json:"id"` + Passport string `orm:"password" json:"pass_port"` + Password string `orm:"password" json:"password"` + NickName string `orm:"nickname" json:"nick__name"` + } + user := &User{ + Id: 1, + Passport: "111", + Password: "222", + NickName: "333", + } + r, err := db.Model(table).FieldsEx("create_time, password").OmitEmpty().Data(user).Insert() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int `orm:"id" json:"id"` + Passport string `orm:"password" json:"pass_port"` + Password string `orm:"password" json:"password"` + NickName string `orm:"nickname" json:"nick__name"` + } + users := make([]*User, 0) + for i := 100; i < 110; i++ { + users = append(users, &User{ + Id: i, + Passport: fmt.Sprintf(`passport_%d`, i), + Password: fmt.Sprintf(`password_%d`, i), + NickName: fmt.Sprintf(`nickname_%d`, i), + }) + } + r, err := db.Model(table).FieldsEx("create_time, password"). + OmitEmpty(). + Batch(2). + Data(users). + Insert() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 10) + }) } func Test_Model_OmitEmpty_Time(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int `orm:"id" json:"id"` - Passport string `orm:"password" json:"pass_port"` - Password string `orm:"password" json:"password"` - Time time.Time `orm:"create_time" ` - } - user := &User{ - Id: 1, - Passport: "111", - Password: "222", - Time: time.Time{}, - } - r, err := db.Model(table).OmitEmpty().Data(user).WherePri(1).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int `orm:"id" json:"id"` + Passport string `orm:"password" json:"pass_port"` + Password string `orm:"password" json:"password"` + Time time.Time `orm:"create_time" ` + } + user := &User{ + Id: 1, + Passport: "111", + Password: "222", + Time: time.Time{}, + } + r, err := db.Model(table).OmitEmpty().Data(user).WherePri(1).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) + }) } func Test_Result_Chunk(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table).Order("id asc").All() - t.AssertNil(err) - chunks := r.Chunk(3) - t.Assert(len(chunks), 4) - t.Assert(chunks[0][0]["id"].Int(), 1) - t.Assert(chunks[1][0]["id"].Int(), 4) - t.Assert(chunks[2][0]["id"].Int(), 7) - t.Assert(chunks[3][0]["id"].Int(), 10) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table).Order("id asc").All() + t.AssertNil(err) + chunks := r.Chunk(3) + t.Assert(len(chunks), 4) + t.Assert(chunks[0][0]["id"].Int(), 1) + t.Assert(chunks[1][0]["id"].Int(), 4) + t.Assert(chunks[2][0]["id"].Int(), 7) + t.Assert(chunks[3][0]["id"].Int(), 10) + }) } func Test_Model_DryRun(t *testing.T) { - table := createInitTable() - defer dropTable(table) - db.SetDryRun(true) - defer db.SetDryRun(false) + table := createInitTable() + defer dropTable(table) + db.SetDryRun(true) + defer db.SetDryRun(false) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["id"], 1) - }) - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table).Data("passport", "port_1").WherePri(1).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 0) - }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["id"], 1) + }) + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table).Data("passport", "port_1").WherePri(1).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 0) + }) } func Test_Model_Join_SubQuery(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - subQuery := fmt.Sprintf("select * from `%s`", table) - r, err := db.Model(table, "t1").Fields("t2.id").LeftJoin(subQuery, "t2", "t2.id=t1.id").Array() - t.AssertNil(err) - t.Assert(len(r), TableSize) - t.Assert(r[0], "1") - t.Assert(r[TableSize-1], TableSize) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + subQuery := fmt.Sprintf("select * from `%s`", table) + r, err := db.Model(table, "t1").Fields("t2.id").LeftJoin(subQuery, "t2", "t2.id=t1.id").Array() + t.AssertNil(err) + t.Assert(len(r), TableSize) + t.Assert(r[0], "1") + t.Assert(r[TableSize-1], TableSize) + }) } func Test_Model_Cache(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test1", - Force: false, - }).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_1") + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test1", + Force: false, + }).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_1") - r, err := db.Model(table).Data("passport", "user_100").WherePri(1).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) + r, err := db.Model(table).Data("passport", "user_100").WherePri(1).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) - one, err = db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test1", - Force: false, - }).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_1") + one, err = db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test1", + Force: false, + }).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_1") - time.Sleep(time.Second * 2) + time.Sleep(time.Second * 2) - one, err = db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test1", - Force: false, - }).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_100") - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test2", - Force: false, - }).WherePri(2).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_2") + one, err = db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test1", + Force: false, + }).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_100") + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test2", + Force: false, + }).WherePri(2).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_2") - r, err := db.Model(table).Data("passport", "user_200").Cache(gdb.CacheOption{ - Duration: -1, - Name: "test2", - Force: false, - }).WherePri(2).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) + r, err := db.Model(table).Data("passport", "user_200").Cache(gdb.CacheOption{ + Duration: -1, + Name: "test2", + Force: false, + }).WherePri(2).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) - one, err = db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test2", - Force: false, - }).WherePri(2).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_200") - }) - // transaction. - gtest.C(t, func(t *gtest.T) { - // make cache for id 3 - one, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test3", - Force: false, - }).WherePri(3).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_3") + one, err = db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test2", + Force: false, + }).WherePri(2).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_200") + }) + // transaction. + gtest.C(t, func(t *gtest.T) { + // make cache for id 3 + one, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test3", + Force: false, + }).WherePri(3).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_3") - r, err := db.Model(table).Data("passport", "user_300").Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test3", - Force: false, - }).WherePri(3).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) + r, err := db.Model(table).Data("passport", "user_300").Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test3", + Force: false, + }).WherePri(3).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) - err = db.Transaction(context.TODO(), func(ctx context.Context, tx gdb.TX) error { - one, err := tx.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test3", - Force: false, - }).WherePri(3).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_300") - return nil - }) - t.AssertNil(err) + err = db.Transaction(context.TODO(), func(ctx context.Context, tx gdb.TX) error { + one, err := tx.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test3", + Force: false, + }).WherePri(3).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_300") + return nil + }) + t.AssertNil(err) - one, err = db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test3", - Force: false, - }).WherePri(3).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_3") - }) - gtest.C(t, func(t *gtest.T) { - // make cache for id 4 - one, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test4", - Force: false, - }).WherePri(4).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_4") + one, err = db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test3", + Force: false, + }).WherePri(3).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_3") + }) + gtest.C(t, func(t *gtest.T) { + // make cache for id 4 + one, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test4", + Force: false, + }).WherePri(4).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_4") - r, err := db.Model(table).Data("passport", "user_400").Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test3", - Force: false, - }).WherePri(4).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) + r, err := db.Model(table).Data("passport", "user_400").Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test3", + Force: false, + }).WherePri(4).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) - err = db.Transaction(context.TODO(), func(ctx context.Context, tx gdb.TX) error { - // Cache feature disabled. - one, err := tx.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test4", - Force: false, - }).WherePri(4).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_400") - // Update the cache. - r, err := tx.Model(table).Data("passport", "user_4000"). - Cache(gdb.CacheOption{ - Duration: -1, - Name: "test4", - Force: false, - }).WherePri(4).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) - return nil - }) - t.AssertNil(err) - // Read from db. - one, err = db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test4", - Force: false, - }).WherePri(4).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_4000") - }) + err = db.Transaction(context.TODO(), func(ctx context.Context, tx gdb.TX) error { + // Cache feature disabled. + one, err := tx.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test4", + Force: false, + }).WherePri(4).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_400") + // Update the cache. + r, err := tx.Model(table).Data("passport", "user_4000"). + Cache(gdb.CacheOption{ + Duration: -1, + Name: "test4", + Force: false, + }).WherePri(4).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) + return nil + }) + t.AssertNil(err) + // Read from db. + one, err = db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test4", + Force: false, + }).WherePri(4).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_4000") + }) } func Test_Model_Having(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id > 1").Having("id > 8").All() - t.AssertNil(err) - t.Assert(len(all), 2) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id > 1").Having("id > ?", 8).All() - t.AssertNil(err) - t.Assert(len(all), 2) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id > ?", 1).Having("id > ?", 8).All() - t.AssertNil(err) - t.Assert(len(all), 2) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id > ?", 1).Having("id", 8).All() - t.AssertNil(err) - t.Assert(len(all), 1) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id > 1").Having("id > 8").All() + t.AssertNil(err) + t.Assert(len(all), 2) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id > 1").Having("id > ?", 8).All() + t.AssertNil(err) + t.Assert(len(all), 2) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id > ?", 1).Having("id > ?", 8).All() + t.AssertNil(err) + t.Assert(len(all), 2) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id > ?", 1).Having("id", 8).All() + t.AssertNil(err) + t.Assert(len(all), 1) + }) } func Test_Model_Distinct(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table, "t").Fields("distinct t.id").Where("id > 1").Having("id > 8").All() - t.AssertNil(err) - t.Assert(len(all), 2) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id > 1").Distinct().Count() - t.AssertNil(err) - t.Assert(count, int64(9)) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table, "t").Fields("distinct t.id").Where("id > 1").Having("id > 8").All() + t.AssertNil(err) + t.Assert(len(all), 2) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id > 1").Distinct().Count() + t.AssertNil(err) + t.Assert(count, int64(9)) + }) } func Test_Model_Min_Max(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table, "t").Fields("min(t.id)").Where("id > 1").Value() - t.AssertNil(err) - t.Assert(value.Int(), 2) - }) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table, "t").Fields("max(t.id)").Where("id > 1").Value() - t.AssertNil(err) - t.Assert(value.Int(), 10) - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table, "t").Fields("min(t.id)").Where("id > 1").Value() + t.AssertNil(err) + t.Assert(value.Int(), 2) + }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table, "t").Fields("max(t.id)").Where("id > 1").Value() + t.AssertNil(err) + t.Assert(value.Int(), 10) + }) } func Test_Model_Fields_AutoMapping(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Fields("ID").Where("id", 2).Value() - t.AssertNil(err) - t.Assert(value.Int(), 2) - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Fields("ID").Where("id", 2).Value() + t.AssertNil(err) + t.Assert(value.Int(), 2) + }) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Fields("NICK_NAME").Where("id", 2).Value() - t.AssertNil(err) - t.Assert(value.String(), "name_2") - }) - // Map - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Fields(g.Map{ - "ID": 1, - "NICK_NAME": 1, - }).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 2) - t.Assert(one["id"], 2) - t.Assert(one["nickname"], "name_2") - }) - // Struct - gtest.C(t, func(t *gtest.T) { - type T struct { - ID int - NICKNAME int - } - one, err := db.Model(table).Fields(&T{ - ID: 0, - NICKNAME: 0, - }).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 2) - t.Assert(one["id"], 2) - t.Assert(one["nickname"], "name_2") - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Fields("NICK_NAME").Where("id", 2).Value() + t.AssertNil(err) + t.Assert(value.String(), "name_2") + }) + // Map + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Fields(g.Map{ + "ID": 1, + "NICK_NAME": 1, + }).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 2) + t.Assert(one["id"], 2) + t.Assert(one["nickname"], "name_2") + }) + // Struct + gtest.C(t, func(t *gtest.T) { + type T struct { + ID int + NICKNAME int + } + one, err := db.Model(table).Fields(&T{ + ID: 0, + NICKNAME: 0, + }).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 2) + t.Assert(one["id"], 2) + t.Assert(one["nickname"], "name_2") + }) } func Test_Model_FieldsEx_AutoMapping(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - // "id": i, - // "passport": fmt.Sprintf(`user_%d`, i), - // "password": fmt.Sprintf(`pass_%d`, i), - // "nickname": fmt.Sprintf(`name_%d`, i), - // "create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(), + // "id": i, + // "passport": fmt.Sprintf(`user_%d`, i), + // "password": fmt.Sprintf(`pass_%d`, i), + // "nickname": fmt.Sprintf(`name_%d`, i), + // "create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(), - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).FieldsEx("create_date, Passport, Password, NickName, CreateTime").Where("id", 2).Value() - t.AssertNil(err) - t.Assert(value.Int(), 2) - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).FieldsEx("create_date, Passport, Password, NickName, CreateTime").Where("id", 2).Value() + t.AssertNil(err) + t.Assert(value.Int(), 2) + }) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).FieldsEx("create_date, ID, Passport, Password, CreateTime").Where("id", 2).Value() - t.AssertNil(err) - t.Assert(value.String(), "name_2") - }) - // Map - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).FieldsEx(g.Map{ - "Passport": 1, - "Password": 1, - "CreateTime": 1, - }).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 3) - t.Assert(one["id"], 2) - t.Assert(one["nickname"], "name_2") - }) - // Struct - gtest.C(t, func(t *gtest.T) { - type T struct { - Passport int - Password int - CreateTime int - } - one, err := db.Model(table).FieldsEx(&T{ - Passport: 0, - Password: 0, - CreateTime: 0, - }).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 3) - t.Assert(one["id"], 2) - t.Assert(one["nickname"], "name_2") - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).FieldsEx("create_date, ID, Passport, Password, CreateTime").Where("id", 2).Value() + t.AssertNil(err) + t.Assert(value.String(), "name_2") + }) + // Map + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).FieldsEx(g.Map{ + "Passport": 1, + "Password": 1, + "CreateTime": 1, + }).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 3) + t.Assert(one["id"], 2) + t.Assert(one["nickname"], "name_2") + }) + // Struct + gtest.C(t, func(t *gtest.T) { + type T struct { + Passport int + Password int + CreateTime int + } + one, err := db.Model(table).FieldsEx(&T{ + Passport: 0, + Password: 0, + CreateTime: 0, + }).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 3) + t.Assert(one["id"], 2) + t.Assert(one["nickname"], "name_2") + }) } func Test_Model_Fields_Struct(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type A struct { - Passport string - Password string - } - type B struct { - A - NickName string - } - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Fields(A{}).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 2) - t.Assert(one["passport"], "user_2") - t.Assert(one["password"], "pass_2") - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Fields(&A{}).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 2) - t.Assert(one["passport"], "user_2") - t.Assert(one["password"], "pass_2") - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Fields(B{}).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 3) - t.Assert(one["passport"], "user_2") - t.Assert(one["password"], "pass_2") - t.Assert(one["nickname"], "name_2") - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Fields(&B{}).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 3) - t.Assert(one["passport"], "user_2") - t.Assert(one["password"], "pass_2") - t.Assert(one["nickname"], "name_2") - }) + type A struct { + Passport string + Password string + } + type B struct { + A + NickName string + } + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Fields(A{}).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 2) + t.Assert(one["passport"], "user_2") + t.Assert(one["password"], "pass_2") + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Fields(&A{}).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 2) + t.Assert(one["passport"], "user_2") + t.Assert(one["password"], "pass_2") + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Fields(B{}).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 3) + t.Assert(one["passport"], "user_2") + t.Assert(one["password"], "pass_2") + t.Assert(one["nickname"], "name_2") + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Fields(&B{}).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 3) + t.Assert(one["passport"], "user_2") + t.Assert(one["password"], "pass_2") + t.Assert(one["nickname"], "name_2") + }) } func Test_Model_NullField(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport *string - } - data := g.Map{ - "id": 1, - "passport": nil, - } - result, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport *string + } + data := g.Map{ + "id": 1, + "passport": nil, + } + result, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) - var user *User - err = one.Struct(&user) - t.AssertNil(err) - t.Assert(user.Id, data["id"]) - t.Assert(user.Passport, data["passport"]) - }) + var user *User + err = one.Struct(&user) + t.AssertNil(err) + t.Assert(user.Id, data["id"]) + t.Assert(user.Passport, data["passport"]) + }) } func Test_Model_Empty_Slice_Argument(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where(`id`, g.Slice{}).All() - t.AssertNil(err) - t.Assert(len(result), 0) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where(`id in(?)`, g.Slice{}).All() - t.AssertNil(err) - t.Assert(len(result), 0) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where(`id`, g.Slice{}).All() + t.AssertNil(err) + t.Assert(len(result), 0) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where(`id in(?)`, g.Slice{}).All() + t.AssertNil(err) + t.Assert(len(result), 0) + }) } func Test_Model_HasTable(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - t.AssertNil(db.GetCore().ClearCacheAll(ctx)) - result, err := db.GetCore().HasTable(table) - t.Assert(result, true) - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + t.AssertNil(db.GetCore().ClearCacheAll(ctx)) + result, err := db.GetCore().HasTable(table) + t.Assert(result, true) + t.AssertNil(err) + }) - gtest.C(t, func(t *gtest.T) { - t.AssertNil(db.GetCore().ClearCacheAll(ctx)) - result, err := db.GetCore().HasTable("table12321") - t.Assert(result, false) - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + t.AssertNil(db.GetCore().ClearCacheAll(ctx)) + result, err := db.GetCore().HasTable("table12321") + t.Assert(result, false) + t.AssertNil(err) + }) } func Test_Model_HasField(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).HasField("id") - t.Assert(result, true) - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).HasField("id") + t.Assert(result, true) + t.AssertNil(err) + }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).HasField("id123") - t.Assert(result, false) - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).HasField("id123") + t.Assert(result, false) + t.AssertNil(err) + }) } func createTableForTimeZoneTest() string { - tableName := "user_" + gtime.Now().TimestampNanoStr() - if _, err := db.Exec(ctx, fmt.Sprintf(` + tableName := "user_" + gtime.Now().TimestampNanoStr() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT, passport varchar(45) NULL, @@ -2521,698 +2521,698 @@ func createTableForTimeZoneTest() string { PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, tableName, - )); err != nil { - gtest.Fatal(err) - } - return tableName + )); err != nil { + gtest.Fatal(err) + } + return tableName } // https://github.com/gogf/gf/issues/1012 func Test_TimeZoneInsert(t *testing.T) { - tableName := createTableForTimeZoneTest() - defer dropTable(tableName) + tableName := createTableForTimeZoneTest() + defer dropTable(tableName) - tokyoLoc, err := time.LoadLocation("Asia/Tokyo") - gtest.AssertNil(err) + tokyoLoc, err := time.LoadLocation("Asia/Tokyo") + gtest.AssertNil(err) - CreateTime := "2020-11-22 12:23:45" - UpdateTime := "2020-11-22 13:23:46" - DeleteTime := "2020-11-22 14:23:47" - type User struct { - Id int `json:"id"` - CreatedAt *gtime.Time `json:"created_at"` - UpdatedAt gtime.Time `json:"updated_at"` - DeletedAt time.Time `json:"deleted_at"` - } - t1, _ := time.ParseInLocation("2006-01-02 15:04:05", CreateTime, tokyoLoc) - t2, _ := time.ParseInLocation("2006-01-02 15:04:05", UpdateTime, tokyoLoc) - t3, _ := time.ParseInLocation("2006-01-02 15:04:05", DeleteTime, tokyoLoc) - u := &User{ - Id: 1, - CreatedAt: gtime.New(t1.UTC()), - UpdatedAt: *gtime.New(t2.UTC()), - DeletedAt: t3.UTC(), - } + CreateTime := "2020-11-22 12:23:45" + UpdateTime := "2020-11-22 13:23:46" + DeleteTime := "2020-11-22 14:23:47" + type User struct { + Id int `json:"id"` + CreatedAt *gtime.Time `json:"created_at"` + UpdatedAt gtime.Time `json:"updated_at"` + DeletedAt time.Time `json:"deleted_at"` + } + t1, _ := time.ParseInLocation("2006-01-02 15:04:05", CreateTime, tokyoLoc) + t2, _ := time.ParseInLocation("2006-01-02 15:04:05", UpdateTime, tokyoLoc) + t3, _ := time.ParseInLocation("2006-01-02 15:04:05", DeleteTime, tokyoLoc) + u := &User{ + Id: 1, + CreatedAt: gtime.New(t1.UTC()), + UpdatedAt: *gtime.New(t2.UTC()), + DeletedAt: t3.UTC(), + } - gtest.C(t, func(t *gtest.T) { - _, err = db.Model(tableName).Unscoped().Insert(u) - t.AssertNil(err) - userEntity := &User{} - err = db.Model(tableName).Where("id", 1).Unscoped().Scan(&userEntity) - t.AssertNil(err) - t.Assert(userEntity.CreatedAt.String(), "2020-11-22 11:23:45") - t.Assert(userEntity.UpdatedAt.String(), "2020-11-22 12:23:46") - t.Assert(gtime.NewFromTime(userEntity.DeletedAt).String(), "2020-11-22 13:23:47") - }) + gtest.C(t, func(t *gtest.T) { + _, err = db.Model(tableName).Unscoped().Insert(u) + t.AssertNil(err) + userEntity := &User{} + err = db.Model(tableName).Where("id", 1).Unscoped().Scan(&userEntity) + t.AssertNil(err) + t.Assert(userEntity.CreatedAt.String(), "2020-11-22 11:23:45") + t.Assert(userEntity.UpdatedAt.String(), "2020-11-22 12:23:46") + t.Assert(gtime.NewFromTime(userEntity.DeletedAt).String(), "2020-11-22 13:23:47") + }) } func Test_Model_Fields_Map_Struct(t *testing.T) { - table := createInitTable() - defer dropTable(table) - // map - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Fields(g.Map{ - "ID": 1, - "PASSPORT": 1, - "NONE_EXIST": 1, - }).Where("id", 1).One() - t.AssertNil(err) - t.Assert(len(result), 2) - t.Assert(result["id"], 1) - t.Assert(result["passport"], "user_1") - }) - // struct - gtest.C(t, func(t *gtest.T) { - type A struct { - ID int - PASSPORT string - XXX_TYPE int - } - a := A{} - err := db.Model(table).Fields(a).Where("id", 1).Scan(&a) - t.AssertNil(err) - t.Assert(a.ID, 1) - t.Assert(a.PASSPORT, "user_1") - t.Assert(a.XXX_TYPE, 0) - }) - // *struct - gtest.C(t, func(t *gtest.T) { - type A struct { - ID int - PASSPORT string - XXX_TYPE int - } - var a *A - err := db.Model(table).Fields(a).Where("id", 1).Scan(&a) - t.AssertNil(err) - t.Assert(a.ID, 1) - t.Assert(a.PASSPORT, "user_1") - t.Assert(a.XXX_TYPE, 0) - }) - // **struct - gtest.C(t, func(t *gtest.T) { - type A struct { - ID int - PASSPORT string - XXX_TYPE int - } - var a *A - err := db.Model(table).Fields(&a).Where("id", 1).Scan(&a) - t.AssertNil(err) - t.Assert(a.ID, 1) - t.Assert(a.PASSPORT, "user_1") - t.Assert(a.XXX_TYPE, 0) - }) + table := createInitTable() + defer dropTable(table) + // map + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Fields(g.Map{ + "ID": 1, + "PASSPORT": 1, + "NONE_EXIST": 1, + }).Where("id", 1).One() + t.AssertNil(err) + t.Assert(len(result), 2) + t.Assert(result["id"], 1) + t.Assert(result["passport"], "user_1") + }) + // struct + gtest.C(t, func(t *gtest.T) { + type A struct { + ID int + PASSPORT string + XXX_TYPE int + } + a := A{} + err := db.Model(table).Fields(a).Where("id", 1).Scan(&a) + t.AssertNil(err) + t.Assert(a.ID, 1) + t.Assert(a.PASSPORT, "user_1") + t.Assert(a.XXX_TYPE, 0) + }) + // *struct + gtest.C(t, func(t *gtest.T) { + type A struct { + ID int + PASSPORT string + XXX_TYPE int + } + var a *A + err := db.Model(table).Fields(a).Where("id", 1).Scan(&a) + t.AssertNil(err) + t.Assert(a.ID, 1) + t.Assert(a.PASSPORT, "user_1") + t.Assert(a.XXX_TYPE, 0) + }) + // **struct + gtest.C(t, func(t *gtest.T) { + type A struct { + ID int + PASSPORT string + XXX_TYPE int + } + var a *A + err := db.Model(table).Fields(&a).Where("id", 1).Scan(&a) + t.AssertNil(err) + t.Assert(a.ID, 1) + t.Assert(a.PASSPORT, "user_1") + t.Assert(a.XXX_TYPE, 0) + }) } func Test_Model_Min_Max_Avg_Sum(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Min("id") - t.AssertNil(err) - t.Assert(result, 1) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Max("id") - t.AssertNil(err) - t.Assert(result, TableSize) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Avg("id") - t.AssertNil(err) - t.Assert(result, 5.5) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Sum("id") - t.AssertNil(err) - t.Assert(result, 55) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Min("id") + t.AssertNil(err) + t.Assert(result, 1) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Max("id") + t.AssertNil(err) + t.Assert(result, TableSize) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Avg("id") + t.AssertNil(err) + t.Assert(result, 5.5) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Sum("id") + t.AssertNil(err) + t.Assert(result, 55) + }) } func Test_Model_CountColumn(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).CountColumn("id") - t.AssertNil(err) - t.Assert(result, TableSize) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).WhereIn("id", g.Slice{1, 2, 3}).CountColumn("id") - t.AssertNil(err) - t.Assert(result, 3) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).CountColumn("id") + t.AssertNil(err) + t.Assert(result, TableSize) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).WhereIn("id", g.Slice{1, 2, 3}).CountColumn("id") + t.AssertNil(err) + t.Assert(result, 3) + }) } func Test_Model_InsertAndGetId(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - id, err := db.Model(table).Data(g.Map{ - "id": 1, - "passport": "user_1", - "password": "pass_1", - "nickname": "name_1", - }).InsertAndGetId() - t.AssertNil(err) - t.Assert(id, 1) - }) - gtest.C(t, func(t *gtest.T) { - id, err := db.Model(table).Data(g.Map{ - "passport": "user_2", - "password": "pass_2", - "nickname": "name_2", - }).InsertAndGetId() - t.AssertNil(err) - t.Assert(id, 2) - }) + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + id, err := db.Model(table).Data(g.Map{ + "id": 1, + "passport": "user_1", + "password": "pass_1", + "nickname": "name_1", + }).InsertAndGetId() + t.AssertNil(err) + t.Assert(id, 1) + }) + gtest.C(t, func(t *gtest.T) { + id, err := db.Model(table).Data(g.Map{ + "passport": "user_2", + "password": "pass_2", + "nickname": "name_2", + }).InsertAndGetId() + t.AssertNil(err) + t.Assert(id, 2) + }) } func Test_Model_Increment_Decrement(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where("id", 1).Increment("id", 100) - t.AssertNil(err) - rows, _ := result.RowsAffected() - t.Assert(rows, 1) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where("id", 101).Decrement("id", 10) - t.AssertNil(err) - rows, _ := result.RowsAffected() - t.Assert(rows, 1) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 91).Count() - t.AssertNil(err) - t.Assert(count, int64(1)) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where("id", 1).Increment("id", 100) + t.AssertNil(err) + rows, _ := result.RowsAffected() + t.Assert(rows, 1) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where("id", 101).Decrement("id", 10) + t.AssertNil(err) + rows, _ := result.RowsAffected() + t.Assert(rows, 1) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 91).Count() + t.AssertNil(err) + t.Assert(count, int64(1)) + }) } func Test_Model_OnDuplicate(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - // string type 1. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicate("passport,password").Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // string type 1. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicate("passport,password").Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) - // string type 2. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicate("passport", "password").Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // string type 2. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicate("passport", "password").Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) - // slice. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicate(g.Slice{"passport", "password"}).Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // slice. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicate(g.Slice{"passport", "password"}).Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) - // map. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicate(g.Map{ - "passport": "nickname", - "password": "nickname", - }).Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["nickname"]) - t.Assert(one["password"], data["nickname"]) - t.Assert(one["nickname"], "name_1") - }) + // map. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicate(g.Map{ + "passport": "nickname", + "password": "nickname", + }).Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["nickname"]) + t.Assert(one["password"], data["nickname"]) + t.Assert(one["nickname"], "name_1") + }) - // map+raw. - gtest.C(t, func(t *gtest.T) { - data := g.MapStrStr{ - "id": "1", - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicate(g.Map{ - "passport": gdb.Raw("CONCAT(VALUES(`passport`), '1')"), - "password": gdb.Raw("CONCAT(VALUES(`password`), '2')"), - }).Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]+"1") - t.Assert(one["password"], data["password"]+"2") - t.Assert(one["nickname"], "name_1") - }) + // map+raw. + gtest.C(t, func(t *gtest.T) { + data := g.MapStrStr{ + "id": "1", + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicate(g.Map{ + "passport": gdb.Raw("CONCAT(VALUES(`passport`), '1')"), + "password": gdb.Raw("CONCAT(VALUES(`password`), '2')"), + }).Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]+"1") + t.Assert(one["password"], data["password"]+"2") + t.Assert(one["nickname"], "name_1") + }) } func Test_Model_OnDuplicateEx(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - // string type 1. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicateEx("nickname,create_time").Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // string type 1. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicateEx("nickname,create_time").Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) - // string type 2. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicateEx("nickname", "create_time").Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // string type 2. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicateEx("nickname", "create_time").Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) - // slice. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicateEx(g.Slice{"nickname", "create_time"}).Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // slice. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicateEx(g.Slice{"nickname", "create_time"}).Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) - // map. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicateEx(g.Map{ - "nickname": "nickname", - "create_time": "nickname", - }).Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // map. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicateEx(g.Map{ + "nickname": "nickname", + "create_time": "nickname", + }).Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) } func Test_Model_Raw(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db. - Raw(fmt.Sprintf("select * from %s where id in (?)", table), g.Slice{1, 5, 7, 8, 9, 10}). - WhereLT("id", 8). - WhereIn("id", g.Slice{1, 2, 3, 4, 5, 6, 7}). - OrderDesc("id"). - Limit(2). - All() - t.AssertNil(err) - t.Assert(len(all), 2) - t.Assert(all[0]["id"], 7) - t.Assert(all[1]["id"], 5) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db. + Raw(fmt.Sprintf("select * from %s where id in (?)", table), g.Slice{1, 5, 7, 8, 9, 10}). + WhereLT("id", 8). + WhereIn("id", g.Slice{1, 2, 3, 4, 5, 6, 7}). + OrderDesc("id"). + Limit(2). + All() + t.AssertNil(err) + t.Assert(len(all), 2) + t.Assert(all[0]["id"], 7) + t.Assert(all[1]["id"], 5) + }) - gtest.C(t, func(t *gtest.T) { - count, err := db. - Raw(fmt.Sprintf("select * from %s where id in (?)", table), g.Slice{1, 5, 7, 8, 9, 10}). - WhereLT("id", 8). - WhereIn("id", g.Slice{1, 2, 3, 4, 5, 6, 7}). - OrderDesc("id"). - Limit(2). - Count() - t.AssertNil(err) - t.Assert(count, int64(6)) - }) + gtest.C(t, func(t *gtest.T) { + count, err := db. + Raw(fmt.Sprintf("select * from %s where id in (?)", table), g.Slice{1, 5, 7, 8, 9, 10}). + WhereLT("id", 8). + WhereIn("id", g.Slice{1, 2, 3, 4, 5, 6, 7}). + OrderDesc("id"). + Limit(2). + Count() + t.AssertNil(err) + t.Assert(count, int64(6)) + }) } func Test_Model_Handler(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - m := db.Model(table).Safe().Handler( - func(m *gdb.Model) *gdb.Model { - return m.Page(0, 3) - }, - func(m *gdb.Model) *gdb.Model { - return m.Where("id", g.Slice{1, 2, 3, 4, 5, 6}) - }, - func(m *gdb.Model) *gdb.Model { - return m.OrderDesc("id") - }, - ) - all, err := m.All() - t.AssertNil(err) - t.Assert(len(all), 3) - t.Assert(all[0]["id"], 6) - t.Assert(all[2]["id"], 4) - }) + gtest.C(t, func(t *gtest.T) { + m := db.Model(table).Safe().Handler( + func(m *gdb.Model) *gdb.Model { + return m.Page(0, 3) + }, + func(m *gdb.Model) *gdb.Model { + return m.Where("id", g.Slice{1, 2, 3, 4, 5, 6}) + }, + func(m *gdb.Model) *gdb.Model { + return m.OrderDesc("id") + }, + ) + all, err := m.All() + t.AssertNil(err) + t.Assert(len(all), 3) + t.Assert(all[0]["id"], 6) + t.Assert(all[2]["id"], 4) + }) } func Test_Model_FieldCount(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Fields("id").FieldCount("id", "total").Group("id").OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all), TableSize) - t.Assert(all[0]["id"], 1) - t.Assert(all[0]["total"].Int(), 1) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Fields("id").FieldCount("id", "total").Group("id").OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all), TableSize) + t.Assert(all[0]["id"], 1) + t.Assert(all[0]["total"].Int(), 1) + }) } func Test_Model_FieldMax(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Fields("id").FieldMax("id", "total").Group("id").OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all), TableSize) - t.Assert(all[0]["id"], 1) - t.Assert(all[0]["total"].Int(), 1) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Fields("id").FieldMax("id", "total").Group("id").OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all), TableSize) + t.Assert(all[0]["id"], 1) + t.Assert(all[0]["total"].Int(), 1) + }) } func Test_Model_FieldMin(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Fields("id").FieldMin("id", "total").Group("id").OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all), TableSize) - t.Assert(all[0]["id"], 1) - t.Assert(all[0]["total"].Int(), 1) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Fields("id").FieldMin("id", "total").Group("id").OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all), TableSize) + t.Assert(all[0]["id"], 1) + t.Assert(all[0]["total"].Int(), 1) + }) } func Test_Model_FieldAvg(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Fields("id").FieldAvg("id", "total").Group("id").OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all), TableSize) - t.Assert(all[0]["id"], 1) - t.Assert(all[0]["total"].Int(), 1) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Fields("id").FieldAvg("id", "total").Group("id").OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all), TableSize) + t.Assert(all[0]["id"], 1) + t.Assert(all[0]["total"].Int(), 1) + }) } func Test_Model_OmitEmptyWhere(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - // Basic type where. - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 0).Count() - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).OmitEmptyWhere().Where("id", 0).Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).OmitEmptyWhere().Where("id", 0).Where("nickname", "").Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - // Slice where. - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", g.Slice{1, 2, 3}).Count() - t.AssertNil(err) - t.Assert(count, int64(3)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", g.Slice{}).Count() - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).OmitEmptyWhere().Where("id", g.Slice{}).Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", g.Slice{}).OmitEmptyWhere().Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - // Struct Where. - gtest.C(t, func(t *gtest.T) { - type Input struct { - Id []int - Name []string - } - count, err := db.Model(table).Where(Input{}).Count() - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - type Input struct { - Id []int - Name []string - } - count, err := db.Model(table).Where(Input{}).OmitEmptyWhere().Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - // Map Where. - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where(g.Map{ - "id": []int{}, - "nickname": []string{}, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - type Input struct { - Id []int - } - count, err := db.Model(table).Where(g.Map{ - "id": []int{}, - }).OmitEmptyWhere().Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) + // Basic type where. + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 0).Count() + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).OmitEmptyWhere().Where("id", 0).Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).OmitEmptyWhere().Where("id", 0).Where("nickname", "").Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + // Slice where. + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", g.Slice{1, 2, 3}).Count() + t.AssertNil(err) + t.Assert(count, int64(3)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", g.Slice{}).Count() + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).OmitEmptyWhere().Where("id", g.Slice{}).Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", g.Slice{}).OmitEmptyWhere().Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + // Struct Where. + gtest.C(t, func(t *gtest.T) { + type Input struct { + Id []int + Name []string + } + count, err := db.Model(table).Where(Input{}).Count() + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + type Input struct { + Id []int + Name []string + } + count, err := db.Model(table).Where(Input{}).OmitEmptyWhere().Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + // Map Where. + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where(g.Map{ + "id": []int{}, + "nickname": []string{}, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + type Input struct { + Id []int + } + count, err := db.Model(table).Where(g.Map{ + "id": []int{}, + }).OmitEmptyWhere().Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) } // https://github.com/gogf/gf/issues/1387 func Test_Model_GTime_DefaultValue(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - Nickname string - CreateTime *gtime.Time - } - data := User{ - Id: 1, - Passport: "user_1", - Password: "pass_1", - Nickname: "name_1", - } - // Insert - _, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + Nickname string + CreateTime *gtime.Time + } + data := User{ + Id: 1, + Passport: "user_1", + Password: "pass_1", + Nickname: "name_1", + } + // Insert + _, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) - // Select - var ( - user *User - ) - err = db.Model(table).Scan(&user) - t.AssertNil(err) - t.Assert(user.Passport, data.Passport) - t.Assert(user.Password, data.Password) - t.Assert(user.CreateTime, data.CreateTime) - t.Assert(user.Nickname, data.Nickname) + // Select + var ( + user *User + ) + err = db.Model(table).Scan(&user) + t.AssertNil(err) + t.Assert(user.Passport, data.Passport) + t.Assert(user.Password, data.Password) + t.Assert(user.CreateTime, data.CreateTime) + t.Assert(user.Nickname, data.Nickname) - // Insert - user.Id = 2 - _, err = db.Model(table).Data(user).Insert() - t.AssertNil(err) - }) + // Insert + user.Id = 2 + _, err = db.Model(table).Data(user).Insert() + t.AssertNil(err) + }) } // Using filter does not affect the outside value inside function. func Test_Model_Insert_Filter(t *testing.T) { - // map - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - data := g.Map{ - "id": 1, - "uid": 1, - "passport": "t1", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_1", - "create_time": gtime.Now().String(), - } - result, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) - n, _ := result.LastInsertId() - t.Assert(n, 1) + // map + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + data := g.Map{ + "id": 1, + "uid": 1, + "passport": "t1", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_1", + "create_time": gtime.Now().String(), + } + result, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) + n, _ := result.LastInsertId() + t.Assert(n, 1) - t.Assert(data["uid"], 1) - }) - // slice - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - data := g.List{ - g.Map{ - "id": 1, - "uid": 1, - "passport": "t1", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_1", - "create_time": gtime.Now().String(), - }, - g.Map{ - "id": 2, - "uid": 2, - "passport": "t1", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_1", - "create_time": gtime.Now().String(), - }, - } + t.Assert(data["uid"], 1) + }) + // slice + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + data := g.List{ + g.Map{ + "id": 1, + "uid": 1, + "passport": "t1", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_1", + "create_time": gtime.Now().String(), + }, + g.Map{ + "id": 2, + "uid": 2, + "passport": "t1", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_1", + "create_time": gtime.Now().String(), + }, + } - result, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) - n, _ := result.LastInsertId() - t.Assert(n, 2) + result, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) + n, _ := result.LastInsertId() + t.Assert(n, 2) - t.Assert(data[0]["uid"], 1) - t.Assert(data[1]["uid"], 2) - }) + t.Assert(data[0]["uid"], 1) + t.Assert(data[1]["uid"], 2) + }) } func Test_Model_Embedded_Filter(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type Base struct { - Id int - Uid int - CreateTime string - NoneExist string - } - type User struct { - Base - Passport string - Password string - Nickname string - } - result, err := db.Model(table).Data(User{ - Passport: "john-test", - Password: "123456", - Nickname: "John", - Base: Base{ - Id: 100, - Uid: 100, - CreateTime: gtime.Now().String(), - }, - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type Base struct { + Id int + Uid int + CreateTime string + NoneExist string + } + type User struct { + Base + Passport string + Password string + Nickname string + } + result, err := db.Model(table).Data(User{ + Passport: "john-test", + Password: "123456", + Nickname: "John", + Base: Base{ + Id: 100, + Uid: 100, + CreateTime: gtime.Now().String(), + }, + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) - var user *User - err = db.Model(table).Fields(user).Where("id=100").Scan(&user) - t.AssertNil(err) - t.Assert(user.Passport, "john-test") - t.Assert(user.Id, 100) - }) + var user *User + err = db.Model(table).Fields(user).Where("id=100").Scan(&user) + t.AssertNil(err) + t.Assert(user.Passport, "john-test") + t.Assert(user.Id, 100) + }) } // This is no longer used as the filter feature is automatically enabled from GoFrame v1.16.0. @@ -3242,29 +3242,29 @@ func Test_Model_Embedded_Filter(t *testing.T) { // } func Test_Model_Fields_AutoFilterInJoinStatement(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - var err error - table1 := "user" - table2 := "score" - table3 := "info" - if _, err := db.Exec(ctx, fmt.Sprintf(` + gtest.C(t, func(t *gtest.T) { + var err error + table1 := "user" + table2 := "score" + table3 := "info" + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE IF NOT EXISTS %s ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(500) NOT NULL DEFAULT '', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; `, table1, - )); err != nil { - t.AssertNil(err) - } - defer dropTable(table1) - _, err = db.Model(table1).Insert(g.Map{ - "id": 1, - "name": "john", - }) - t.AssertNil(err) + )); err != nil { + t.AssertNil(err) + } + defer dropTable(table1) + _, err = db.Model(table1).Insert(g.Map{ + "id": 1, + "name": "john", + }) + t.AssertNil(err) - if _, err := db.Exec(ctx, fmt.Sprintf(` + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE IF NOT EXISTS %s ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL DEFAULT 0, @@ -3272,18 +3272,18 @@ func Test_Model_Fields_AutoFilterInJoinStatement(t *testing.T) { PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; `, table2, - )); err != nil { - t.AssertNil(err) - } - defer dropTable(table2) - _, err = db.Model(table2).Insert(g.Map{ - "id": 1, - "user_id": 1, - "number": "n", - }) - t.AssertNil(err) + )); err != nil { + t.AssertNil(err) + } + defer dropTable(table2) + _, err = db.Model(table2).Insert(g.Map{ + "id": 1, + "user_id": 1, + "number": "n", + }) + t.AssertNil(err) - if _, err := db.Exec(ctx, fmt.Sprintf(` + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE IF NOT EXISTS %s ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL DEFAULT 0, @@ -3291,558 +3291,558 @@ func Test_Model_Fields_AutoFilterInJoinStatement(t *testing.T) { PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; `, table3, - )); err != nil { - t.AssertNil(err) - } - defer dropTable(table3) - _, err = db.Model(table3).Insert(g.Map{ - "id": 1, - "user_id": 1, - "description": "brief", - }) - t.AssertNil(err) + )); err != nil { + t.AssertNil(err) + } + defer dropTable(table3) + _, err = db.Model(table3).Insert(g.Map{ + "id": 1, + "user_id": 1, + "description": "brief", + }) + t.AssertNil(err) - one, err := db.Model("user"). - Where("user.id", 1). - Fields("score.number,user.name"). - LeftJoin("score", "user.id=score.user_id"). - LeftJoin("info", "info.id=info.user_id"). - Order("user.id asc"). - One() - t.AssertNil(err) - t.Assert(len(one), 2) - t.Assert(one["name"].String(), "john") - t.Assert(one["number"].String(), "n") + one, err := db.Model("user"). + Where("user.id", 1). + Fields("score.number,user.name"). + LeftJoin("score", "user.id=score.user_id"). + LeftJoin("info", "info.id=info.user_id"). + Order("user.id asc"). + One() + t.AssertNil(err) + t.Assert(len(one), 2) + t.Assert(one["name"].String(), "john") + t.Assert(one["number"].String(), "n") - one, err = db.Model("user"). - LeftJoin("score", "user.id=score.user_id"). - LeftJoin("info", "info.id=info.user_id"). - Fields("score.number,user.name"). - One() - t.AssertNil(err) - t.Assert(len(one), 2) - t.Assert(one["name"].String(), "john") - t.Assert(one["number"].String(), "n") - }) + one, err = db.Model("user"). + LeftJoin("score", "user.id=score.user_id"). + LeftJoin("info", "info.id=info.user_id"). + Fields("score.number,user.name"). + One() + t.AssertNil(err) + t.Assert(len(one), 2) + t.Assert(one["name"].String(), "john") + t.Assert(one["number"].String(), "n") + }) } // https://github.com/gogf/gf/issues/1159 func Test_ScanList_NoRecreate_PtrAttribute(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - type S1 struct { - Id int - Name string - Age int - Score int - } - type S3 struct { - One *S1 - } - var ( - s []*S3 - err error - ) - r1 := gdb.Result{ - gdb.Record{ - "id": gdb.NewValue(1), - "name": gdb.NewValue("john"), - "age": gdb.NewValue(16), - }, - gdb.Record{ - "id": gdb.NewValue(2), - "name": gdb.NewValue("smith"), - "age": gdb.NewValue(18), - }, - } - err = r1.ScanList(&s, "One") - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) + gtest.C(t, func(t *gtest.T) { + type S1 struct { + Id int + Name string + Age int + Score int + } + type S3 struct { + One *S1 + } + var ( + s []*S3 + err error + ) + r1 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(1), + "name": gdb.NewValue("john"), + "age": gdb.NewValue(16), + }, + gdb.Record{ + "id": gdb.NewValue(2), + "name": gdb.NewValue("smith"), + "age": gdb.NewValue(18), + }, + } + err = r1.ScanList(&s, "One") + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) - r2 := gdb.Result{ - gdb.Record{ - "id": gdb.NewValue(1), - "age": gdb.NewValue(20), - }, - gdb.Record{ - "id": gdb.NewValue(2), - "age": gdb.NewValue(21), - }, - } - err = r2.ScanList(&s, "One", "One", "id:Id") - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 20) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 21) - }) + r2 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(1), + "age": gdb.NewValue(20), + }, + gdb.Record{ + "id": gdb.NewValue(2), + "age": gdb.NewValue(21), + }, + } + err = r2.ScanList(&s, "One", "One", "id:Id") + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 20) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 21) + }) } // https://github.com/gogf/gf/issues/1159 func Test_ScanList_NoRecreate_StructAttribute(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - type S1 struct { - Id int - Name string - Age int - Score int - } - type S3 struct { - One S1 - } - var ( - s []*S3 - err error - ) - r1 := gdb.Result{ - gdb.Record{ - "id": gdb.NewValue(1), - "name": gdb.NewValue("john"), - "age": gdb.NewValue(16), - }, - gdb.Record{ - "id": gdb.NewValue(2), - "name": gdb.NewValue("smith"), - "age": gdb.NewValue(18), - }, - } - err = r1.ScanList(&s, "One") - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) + gtest.C(t, func(t *gtest.T) { + type S1 struct { + Id int + Name string + Age int + Score int + } + type S3 struct { + One S1 + } + var ( + s []*S3 + err error + ) + r1 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(1), + "name": gdb.NewValue("john"), + "age": gdb.NewValue(16), + }, + gdb.Record{ + "id": gdb.NewValue(2), + "name": gdb.NewValue("smith"), + "age": gdb.NewValue(18), + }, + } + err = r1.ScanList(&s, "One") + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) - r2 := gdb.Result{ - gdb.Record{ - "id": gdb.NewValue(1), - "age": gdb.NewValue(20), - }, - gdb.Record{ - "id": gdb.NewValue(2), - "age": gdb.NewValue(21), - }, - } - err = r2.ScanList(&s, "One", "One", "id:Id") - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 20) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 21) - }) + r2 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(1), + "age": gdb.NewValue(20), + }, + gdb.Record{ + "id": gdb.NewValue(2), + "age": gdb.NewValue(21), + }, + } + err = r2.ScanList(&s, "One", "One", "id:Id") + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 20) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 21) + }) } // https://github.com/gogf/gf/issues/1159 func Test_ScanList_NoRecreate_SliceAttribute_Ptr(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - type S1 struct { - Id int - Name string - Age int - Score int - } - type S2 struct { - Id int - Pid int - Name string - Age int - Score int - } - type S3 struct { - One *S1 - Many []*S2 - } - var ( - s []*S3 - err error - ) - r1 := gdb.Result{ - gdb.Record{ - "id": gdb.NewValue(1), - "name": gdb.NewValue("john"), - "age": gdb.NewValue(16), - }, - gdb.Record{ - "id": gdb.NewValue(2), - "name": gdb.NewValue("smith"), - "age": gdb.NewValue(18), - }, - } - err = r1.ScanList(&s, "One") - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) + gtest.C(t, func(t *gtest.T) { + type S1 struct { + Id int + Name string + Age int + Score int + } + type S2 struct { + Id int + Pid int + Name string + Age int + Score int + } + type S3 struct { + One *S1 + Many []*S2 + } + var ( + s []*S3 + err error + ) + r1 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(1), + "name": gdb.NewValue("john"), + "age": gdb.NewValue(16), + }, + gdb.Record{ + "id": gdb.NewValue(2), + "name": gdb.NewValue("smith"), + "age": gdb.NewValue(18), + }, + } + err = r1.ScanList(&s, "One") + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) - r2 := gdb.Result{ - gdb.Record{ - "id": gdb.NewValue(100), - "pid": gdb.NewValue(1), - "age": gdb.NewValue(30), - "name": gdb.NewValue("john"), - }, - gdb.Record{ - "id": gdb.NewValue(200), - "pid": gdb.NewValue(1), - "age": gdb.NewValue(31), - "name": gdb.NewValue("smith"), - }, - } - err = r2.ScanList(&s, "Many", "One", "pid:Id") - // fmt.Printf("%+v", err) - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(len(s[0].Many), 2) - t.Assert(s[0].Many[0].Name, "john") - t.Assert(s[0].Many[0].Age, 30) - t.Assert(s[0].Many[1].Name, "smith") - t.Assert(s[0].Many[1].Age, 31) + r2 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(100), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(30), + "name": gdb.NewValue("john"), + }, + gdb.Record{ + "id": gdb.NewValue(200), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(31), + "name": gdb.NewValue("smith"), + }, + } + err = r2.ScanList(&s, "Many", "One", "pid:Id") + // fmt.Printf("%+v", err) + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(len(s[0].Many), 2) + t.Assert(s[0].Many[0].Name, "john") + t.Assert(s[0].Many[0].Age, 30) + t.Assert(s[0].Many[1].Name, "smith") + t.Assert(s[0].Many[1].Age, 31) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) - t.Assert(len(s[1].Many), 0) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) + t.Assert(len(s[1].Many), 0) - r3 := gdb.Result{ - gdb.Record{ - "id": gdb.NewValue(100), - "pid": gdb.NewValue(1), - "age": gdb.NewValue(40), - }, - gdb.Record{ - "id": gdb.NewValue(200), - "pid": gdb.NewValue(1), - "age": gdb.NewValue(41), - }, - } - err = r3.ScanList(&s, "Many", "One", "pid:Id") - // fmt.Printf("%+v", err) - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(len(s[0].Many), 2) - t.Assert(s[0].Many[0].Name, "john") - t.Assert(s[0].Many[0].Age, 40) - t.Assert(s[0].Many[1].Name, "smith") - t.Assert(s[0].Many[1].Age, 41) + r3 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(100), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(40), + }, + gdb.Record{ + "id": gdb.NewValue(200), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(41), + }, + } + err = r3.ScanList(&s, "Many", "One", "pid:Id") + // fmt.Printf("%+v", err) + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(len(s[0].Many), 2) + t.Assert(s[0].Many[0].Name, "john") + t.Assert(s[0].Many[0].Age, 40) + t.Assert(s[0].Many[1].Name, "smith") + t.Assert(s[0].Many[1].Age, 41) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) - t.Assert(len(s[1].Many), 0) - }) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) + t.Assert(len(s[1].Many), 0) + }) } // https://github.com/gogf/gf/issues/1159 func Test_ScanList_NoRecreate_SliceAttribute_Struct(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - type S1 struct { - Id int - Name string - Age int - Score int - } - type S2 struct { - Id int - Pid int - Name string - Age int - Score int - } - type S3 struct { - One S1 - Many []S2 - } - var ( - s []S3 - err error - ) - r1 := gdb.Result{ - gdb.Record{ - "id": gdb.NewValue(1), - "name": gdb.NewValue("john"), - "age": gdb.NewValue(16), - }, - gdb.Record{ - "id": gdb.NewValue(2), - "name": gdb.NewValue("smith"), - "age": gdb.NewValue(18), - }, - } - err = r1.ScanList(&s, "One") - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) + gtest.C(t, func(t *gtest.T) { + type S1 struct { + Id int + Name string + Age int + Score int + } + type S2 struct { + Id int + Pid int + Name string + Age int + Score int + } + type S3 struct { + One S1 + Many []S2 + } + var ( + s []S3 + err error + ) + r1 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(1), + "name": gdb.NewValue("john"), + "age": gdb.NewValue(16), + }, + gdb.Record{ + "id": gdb.NewValue(2), + "name": gdb.NewValue("smith"), + "age": gdb.NewValue(18), + }, + } + err = r1.ScanList(&s, "One") + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) - r2 := gdb.Result{ - gdb.Record{ - "id": gdb.NewValue(100), - "pid": gdb.NewValue(1), - "age": gdb.NewValue(30), - "name": gdb.NewValue("john"), - }, - gdb.Record{ - "id": gdb.NewValue(200), - "pid": gdb.NewValue(1), - "age": gdb.NewValue(31), - "name": gdb.NewValue("smith"), - }, - } - err = r2.ScanList(&s, "Many", "One", "pid:Id") - // fmt.Printf("%+v", err) - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(len(s[0].Many), 2) - t.Assert(s[0].Many[0].Name, "john") - t.Assert(s[0].Many[0].Age, 30) - t.Assert(s[0].Many[1].Name, "smith") - t.Assert(s[0].Many[1].Age, 31) + r2 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(100), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(30), + "name": gdb.NewValue("john"), + }, + gdb.Record{ + "id": gdb.NewValue(200), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(31), + "name": gdb.NewValue("smith"), + }, + } + err = r2.ScanList(&s, "Many", "One", "pid:Id") + // fmt.Printf("%+v", err) + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(len(s[0].Many), 2) + t.Assert(s[0].Many[0].Name, "john") + t.Assert(s[0].Many[0].Age, 30) + t.Assert(s[0].Many[1].Name, "smith") + t.Assert(s[0].Many[1].Age, 31) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) - t.Assert(len(s[1].Many), 0) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) + t.Assert(len(s[1].Many), 0) - r3 := gdb.Result{ - gdb.Record{ - "id": gdb.NewValue(100), - "pid": gdb.NewValue(1), - "age": gdb.NewValue(40), - }, - gdb.Record{ - "id": gdb.NewValue(200), - "pid": gdb.NewValue(1), - "age": gdb.NewValue(41), - }, - } - err = r3.ScanList(&s, "Many", "One", "pid:Id") - // fmt.Printf("%+v", err) - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(len(s[0].Many), 2) - t.Assert(s[0].Many[0].Name, "john") - t.Assert(s[0].Many[0].Age, 40) - t.Assert(s[0].Many[1].Name, "smith") - t.Assert(s[0].Many[1].Age, 41) + r3 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(100), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(40), + }, + gdb.Record{ + "id": gdb.NewValue(200), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(41), + }, + } + err = r3.ScanList(&s, "Many", "One", "pid:Id") + // fmt.Printf("%+v", err) + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(len(s[0].Many), 2) + t.Assert(s[0].Many[0].Name, "john") + t.Assert(s[0].Many[0].Age, 40) + t.Assert(s[0].Many[1].Name, "smith") + t.Assert(s[0].Many[1].Age, 41) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) - t.Assert(len(s[1].Many), 0) - }) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) + t.Assert(len(s[1].Many), 0) + }) } func TestResult_Structs1(t *testing.T) { - type A struct { - Id int `orm:"id"` - } - type B struct { - *A - Name string - } - gtest.C(t, func(t *gtest.T) { - r := gdb.Result{ - gdb.Record{"id": gdb.NewValue(nil), "name": gdb.NewValue("john")}, - gdb.Record{"id": gdb.NewValue(1), "name": gdb.NewValue("smith")}, - } - array := make([]*B, 2) - err := r.Structs(&array) - t.AssertNil(err) - t.Assert(array[0].Id, 0) - t.Assert(array[1].Id, 1) - t.Assert(array[0].Name, "john") - t.Assert(array[1].Name, "smith") - }) + type A struct { + Id int `orm:"id"` + } + type B struct { + *A + Name string + } + gtest.C(t, func(t *gtest.T) { + r := gdb.Result{ + gdb.Record{"id": gdb.NewValue(nil), "name": gdb.NewValue("john")}, + gdb.Record{"id": gdb.NewValue(1), "name": gdb.NewValue("smith")}, + } + array := make([]*B, 2) + err := r.Structs(&array) + t.AssertNil(err) + t.Assert(array[0].Id, 0) + t.Assert(array[1].Id, 1) + t.Assert(array[0].Name, "john") + t.Assert(array[1].Name, "smith") + }) } func Test_Builder_OmitEmptyWhere(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 1).Count() - t.AssertNil(err) - t.Assert(count, int64(1)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 0).OmitEmptyWhere().Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - gtest.C(t, func(t *gtest.T) { - builder := db.Model(table).OmitEmptyWhere().Builder() - count, err := db.Model(table).Where( - builder.Where("id", 0), - ).Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 1).Count() + t.AssertNil(err) + t.Assert(count, int64(1)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 0).OmitEmptyWhere().Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + gtest.C(t, func(t *gtest.T) { + builder := db.Model(table).OmitEmptyWhere().Builder() + count, err := db.Model(table).Where( + builder.Where("id", 0), + ).Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) } func Test_Scan_Nil_Result_Error(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type S struct { - Id int - Name string - Age int - Score int - } - gtest.C(t, func(t *gtest.T) { - var s *S - err := db.Model(table).Where("id", 1).Scan(&s) - t.AssertNil(err) - t.Assert(s.Id, 1) - }) - gtest.C(t, func(t *gtest.T) { - var s *S - err := db.Model(table).Where("id", 100).Scan(&s) - t.AssertNil(err) - t.Assert(s, nil) - }) - gtest.C(t, func(t *gtest.T) { - var s S - err := db.Model(table).Where("id", 100).Scan(&s) - t.Assert(err, sql.ErrNoRows) - }) - gtest.C(t, func(t *gtest.T) { - var ss []*S - err := db.Model(table).Scan(&ss) - t.AssertNil(err) - t.Assert(len(ss), TableSize) - }) - // If the result is empty, it returns error. - gtest.C(t, func(t *gtest.T) { - var ss = make([]*S, 10) - err := db.Model(table).WhereGT("id", 100).Scan(&ss) - t.Assert(err, sql.ErrNoRows) - }) + type S struct { + Id int + Name string + Age int + Score int + } + gtest.C(t, func(t *gtest.T) { + var s *S + err := db.Model(table).Where("id", 1).Scan(&s) + t.AssertNil(err) + t.Assert(s.Id, 1) + }) + gtest.C(t, func(t *gtest.T) { + var s *S + err := db.Model(table).Where("id", 100).Scan(&s) + t.AssertNil(err) + t.Assert(s, nil) + }) + gtest.C(t, func(t *gtest.T) { + var s S + err := db.Model(table).Where("id", 100).Scan(&s) + t.Assert(err, sql.ErrNoRows) + }) + gtest.C(t, func(t *gtest.T) { + var ss []*S + err := db.Model(table).Scan(&ss) + t.AssertNil(err) + t.Assert(len(ss), TableSize) + }) + // If the result is empty, it returns error. + gtest.C(t, func(t *gtest.T) { + var ss = make([]*S, 10) + err := db.Model(table).WhereGT("id", 100).Scan(&ss) + t.Assert(err, sql.ErrNoRows) + }) } func Test_Model_FixGdbJoin(t *testing.T) { - array := gstr.SplitAndTrim(gtest.DataContent(`fix_gdb_join.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(`common_resource`) - defer dropTable(`managed_resource`) - defer dropTable(`rules_template`) - defer dropTable(`resource_mark`) - gtest.C(t, func(t *gtest.T) { - t.AssertNil(db.GetCore().ClearCacheAll(ctx)) - sqlSlice, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { - orm := db.Model(`managed_resource`).Ctx(ctx). - LeftJoinOnField(`common_resource`, `resource_id`). - LeftJoinOnFields(`resource_mark`, `resource_mark_id`, `=`, `id`). - LeftJoinOnFields(`rules_template`, `rule_template_id`, `=`, `template_id`). - FieldsPrefix( - `managed_resource`, - "resource_id", "user", "status", "status_message", "safe_publication", "rule_template_id", - "created_at", "comments", "expired_at", "resource_mark_id", "instance_id", "resource_name", - "pay_mode"). - FieldsPrefix(`resource_mark`, "mark_name", "color"). - FieldsPrefix(`rules_template`, "name"). - FieldsPrefix(`common_resource`, `src_instance_id`, "database_kind", "source_type", "ip", "port") - all, err := orm.OrderAsc("src_instance_id").All() - t.Assert(len(all), 4) - t.Assert(all[0]["pay_mode"], 1) - t.Assert(all[0]["src_instance_id"], 2) - t.Assert(all[3]["instance_id"], "dmcins-jxy0x75m") - t.Assert(all[3]["src_instance_id"], "vdb-6b6m3u1u") - t.Assert(all[3]["resource_mark_id"], "11") - return err - }) - t.AssertNil(err) + array := gstr.SplitAndTrim(gtest.DataContent(`fix_gdb_join.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(`common_resource`) + defer dropTable(`managed_resource`) + defer dropTable(`rules_template`) + defer dropTable(`resource_mark`) + gtest.C(t, func(t *gtest.T) { + t.AssertNil(db.GetCore().ClearCacheAll(ctx)) + sqlSlice, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { + orm := db.Model(`managed_resource`).Ctx(ctx). + LeftJoinOnField(`common_resource`, `resource_id`). + LeftJoinOnFields(`resource_mark`, `resource_mark_id`, `=`, `id`). + LeftJoinOnFields(`rules_template`, `rule_template_id`, `=`, `template_id`). + FieldsPrefix( + `managed_resource`, + "resource_id", "user", "status", "status_message", "safe_publication", "rule_template_id", + "created_at", "comments", "expired_at", "resource_mark_id", "instance_id", "resource_name", + "pay_mode"). + FieldsPrefix(`resource_mark`, "mark_name", "color"). + FieldsPrefix(`rules_template`, "name"). + FieldsPrefix(`common_resource`, `src_instance_id`, "database_kind", "source_type", "ip", "port") + all, err := orm.OrderAsc("src_instance_id").All() + t.Assert(len(all), 4) + t.Assert(all[0]["pay_mode"], 1) + t.Assert(all[0]["src_instance_id"], 2) + t.Assert(all[3]["instance_id"], "dmcins-jxy0x75m") + t.Assert(all[3]["src_instance_id"], "vdb-6b6m3u1u") + t.Assert(all[3]["resource_mark_id"], "11") + return err + }) + t.AssertNil(err) - t.Assert(gtest.DataContent(`fix_gdb_join_expect.sql`), sqlSlice[len(sqlSlice)-1]) - }) + t.Assert(gtest.DataContent(`fix_gdb_join_expect.sql`), sqlSlice[len(sqlSlice)-1]) + }) } func Test_Model_Year_Date_Time_DateTime_Timestamp(t *testing.T) { - table := "date_time_example" - array := gstr.SplitAndTrim(gtest.DataContent(`date_time_example.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) + table := "date_time_example" + array := gstr.SplitAndTrim(gtest.DataContent(`date_time_example.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - // insert. - var now = gtime.Now() - _, err := db.Model("date_time_example").Insert(g.Map{ - "year": now, - "date": now, - "time": now, - "datetime": now, - "timestamp": now, - }) - t.AssertNil(err) - // select. - one, err := db.Model("date_time_example").One() - t.AssertNil(err) - t.Assert(one["year"].String(), now.Format("Y")) - t.Assert(one["date"].String(), now.Format("Y-m-d")) - t.Assert(one["time"].String(), now.Format("H:i:s")) - t.AssertLT(one["datetime"].GTime().Sub(now).Seconds(), 5) - t.AssertLT(one["timestamp"].GTime().Sub(now).Seconds(), 5) - }) + gtest.C(t, func(t *gtest.T) { + // insert. + var now = gtime.Now() + _, err := db.Model("date_time_example").Insert(g.Map{ + "year": now, + "date": now, + "time": now, + "datetime": now, + "timestamp": now, + }) + t.AssertNil(err) + // select. + one, err := db.Model("date_time_example").One() + t.AssertNil(err) + t.Assert(one["year"].String(), now.Format("Y")) + t.Assert(one["date"].String(), now.Format("Y-m-d")) + t.Assert(one["time"].String(), now.Format("H:i:s")) + t.AssertLT(one["datetime"].GTime().Sub(now).Seconds(), 5) + t.AssertLT(one["timestamp"].GTime().Sub(now).Seconds(), 5) + }) } func Test_OrderBy_Statement_Generated(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - array := gstr.SplitAndTrim(gtest.DataContent(`fix_gdb_order_by.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(`employee`) - sqlArray, _ := gdb.CatchSQL(ctx, func(ctx context.Context) error { - g.DB("default").Ctx(ctx).Model("employee").Order("name asc", "age desc").All() - return nil - }) - rawSql := strings.ReplaceAll(sqlArray[len(sqlArray)-1], " ", "") - expectSql := strings.ReplaceAll("SELECT * FROM `employee` ORDER BY `name` asc, `age` desc", " ", "") - t.Assert(rawSql, expectSql) - }) + gtest.C(t, func(t *gtest.T) { + array := gstr.SplitAndTrim(gtest.DataContent(`fix_gdb_order_by.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(`employee`) + sqlArray, _ := gdb.CatchSQL(ctx, func(ctx context.Context) error { + g.DB("default").Ctx(ctx).Model("employee").Order("name asc", "age desc").All() + return nil + }) + rawSql := strings.ReplaceAll(sqlArray[len(sqlArray)-1], " ", "") + expectSql := strings.ReplaceAll("SELECT * FROM `employee` ORDER BY `name` asc, `age` desc", " ", "") + t.Assert(rawSql, expectSql) + }) } func Test_Fields_Raw(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) - one, err := db.Model(table).Fields(gdb.Raw("1")).One() - t.AssertNil(err) - t.Assert(one["1"], 1) + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) + one, err := db.Model(table).Fields(gdb.Raw("1")).One() + t.AssertNil(err) + t.Assert(one["1"], 1) - one, err = db.Model(table).Fields(gdb.Raw("2")).One() - t.AssertNil(err) - t.Assert(one["2"], 2) + one, err = db.Model(table).Fields(gdb.Raw("2")).One() + t.AssertNil(err) + t.Assert(one["2"], 2) - one, err = db.Model(table).Fields(gdb.Raw("2")).Where("id", 2).One() - t.AssertNil(err) - t.Assert(one["2"], 2) + one, err = db.Model(table).Fields(gdb.Raw("2")).Where("id", 2).One() + t.AssertNil(err) + t.Assert(one["2"], 2) - one, err = db.Model(table).Fields(gdb.Raw("2")).Where("id", 10000000000).One() - t.AssertNil(err) - t.Assert(len(one), 0) - }) + one, err = db.Model(table).Fields(gdb.Raw("2")).Where("id", 10000000000).One() + t.AssertNil(err) + t.Assert(len(one), 0) + }) } diff --git a/contrib/drivers/pgsql/pgsql_convert.go b/contrib/drivers/pgsql/pgsql_convert.go index 9734c2321..c83a1e029 100644 --- a/contrib/drivers/pgsql/pgsql_convert.go +++ b/contrib/drivers/pgsql/pgsql_convert.go @@ -7,130 +7,130 @@ package pgsql import ( - "context" - "reflect" - "strings" + "context" + "reflect" + "strings" - "github.com/lib/pq" + "github.com/lib/pq" - "github.com/gogf/gf/v2/database/gdb" - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/text/gregex" - "github.com/gogf/gf/v2/text/gstr" - "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/text/gregex" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" ) // ConvertValueForField converts value to database acceptable value. func (d *Driver) ConvertValueForField(ctx context.Context, fieldType string, fieldValue interface{}) (interface{}, error) { - if g.IsNil(fieldValue) { - return d.Core.ConvertValueForField(ctx, fieldType, fieldValue) - } + if g.IsNil(fieldValue) { + return d.Core.ConvertValueForField(ctx, fieldType, fieldValue) + } - var fieldValueKind = reflect.TypeOf(fieldValue).Kind() + var fieldValueKind = reflect.TypeOf(fieldValue).Kind() - if fieldValueKind == reflect.Slice { - // For pgsql, json or jsonb require '[]' - if !gstr.Contains(fieldType, "json") { - fieldValue = gstr.ReplaceByMap(gconv.String(fieldValue), - map[string]string{ - "[": "{", - "]": "}", - }, - ) - } - } - return d.Core.ConvertValueForField(ctx, fieldType, fieldValue) + if fieldValueKind == reflect.Slice { + // For pgsql, json or jsonb require '[]' + if !gstr.Contains(fieldType, "json") { + fieldValue = gstr.ReplaceByMap(gconv.String(fieldValue), + map[string]string{ + "[": "{", + "]": "}", + }, + ) + } + } + return d.Core.ConvertValueForField(ctx, fieldType, fieldValue) } // CheckLocalTypeForField checks and returns corresponding local golang type for given db type. func (d *Driver) CheckLocalTypeForField(ctx context.Context, fieldType string, fieldValue interface{}) (gdb.LocalType, error) { - var typeName string - match, _ := gregex.MatchString(`(.+?)\((.+)\)`, fieldType) - if len(match) == 3 { - typeName = gstr.Trim(match[1]) - } else { - typeName = fieldType - } - typeName = strings.ToLower(typeName) - switch typeName { - case - // For pgsql, int2 = smallint. - "int2", - // For pgsql, int4 = integer - "int4": - return gdb.LocalTypeInt, nil + var typeName string + match, _ := gregex.MatchString(`(.+?)\((.+)\)`, fieldType) + if len(match) == 3 { + typeName = gstr.Trim(match[1]) + } else { + typeName = fieldType + } + typeName = strings.ToLower(typeName) + switch typeName { + case + // For pgsql, int2 = smallint. + "int2", + // For pgsql, int4 = integer + "int4": + return gdb.LocalTypeInt, nil - case - // For pgsql, int8 = bigint - "int8": - return gdb.LocalTypeInt64, nil + case + // For pgsql, int8 = bigint + "int8": + return gdb.LocalTypeInt64, nil - case - "_int2", - "_int4": - return gdb.LocalTypeIntSlice, nil + case + "_int2", + "_int4": + return gdb.LocalTypeIntSlice, nil - case - "_int8": - return gdb.LocalTypeInt64Slice, nil + case + "_int8": + return gdb.LocalTypeInt64Slice, nil - case - "_varchar", "_text": - return gdb.LocalTypeStringSlice, nil + case + "_varchar", "_text": + return gdb.LocalTypeStringSlice, nil - default: - return d.Core.CheckLocalTypeForField(ctx, fieldType, fieldValue) - } + default: + return d.Core.CheckLocalTypeForField(ctx, fieldType, fieldValue) + } } // ConvertValueForLocal converts value to local Golang type of value according field type name from database. // The parameter `fieldType` is in lower case, like: // `float(5,2)`, `unsigned double(5,2)`, `decimal(10,2)`, `char(45)`, `varchar(100)`, etc. func (d *Driver) ConvertValueForLocal(ctx context.Context, fieldType string, fieldValue interface{}) (interface{}, error) { - typeName, _ := gregex.ReplaceString(`\(.+\)`, "", fieldType) - typeName = strings.ToLower(typeName) - switch typeName { - // For pgsql, int2 = smallint and int4 = integer. - case "int2", "int4": - return gconv.Int(gconv.String(fieldValue)), nil + typeName, _ := gregex.ReplaceString(`\(.+\)`, "", fieldType) + typeName = strings.ToLower(typeName) + switch typeName { + // For pgsql, int2 = smallint and int4 = integer. + case "int2", "int4": + return gconv.Int(gconv.String(fieldValue)), nil - // For pgsql, int8 = bigint. - case "int8": - return gconv.Int64(gconv.String(fieldValue)), nil + // For pgsql, int8 = bigint. + case "int8": + return gconv.Int64(gconv.String(fieldValue)), nil - // Int32 slice. - case - "_int2", "_int4": - return gconv.Ints( - gstr.ReplaceByMap(gconv.String(fieldValue), - map[string]string{ - "{": "[", - "}": "]", - }, - ), - ), nil + // Int32 slice. + case + "_int2", "_int4": + return gconv.Ints( + gstr.ReplaceByMap(gconv.String(fieldValue), + map[string]string{ + "{": "[", + "}": "]", + }, + ), + ), nil - // Int64 slice. - case - "_int8": - return gconv.Int64s( - gstr.ReplaceByMap(gconv.String(fieldValue), - map[string]string{ - "{": "[", - "}": "]", - }, - ), - ), nil + // Int64 slice. + case + "_int8": + return gconv.Int64s( + gstr.ReplaceByMap(gconv.String(fieldValue), + map[string]string{ + "{": "[", + "}": "]", + }, + ), + ), nil - // String slice. - case "_varchar", "_text": - var result = make(pq.StringArray, 0) - if err := result.Scan(fieldValue); err != nil { - return nil, err - } - return []string(result), nil + // String slice. + case "_varchar", "_text": + var result = make(pq.StringArray, 0) + if err := result.Scan(fieldValue); err != nil { + return nil, err + } + return []string(result), nil - default: - return d.Core.ConvertValueForLocal(ctx, fieldType, fieldValue) - } + default: + return d.Core.ConvertValueForLocal(ctx, fieldType, fieldValue) + } }