// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. // // This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, // You can obtain one at https://github.com/gogf/gf. package pgsql_test import ( "fmt" "testing" "github.com/gogf/gf/v2/container/gmap" "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/gutil" ) func Test_Model_Where(t *testing.T) { table := createInitTable() defer dropTable(table) // string gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("id=? and nickname=?", 3, "name_3").One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) // slice gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(g.Slice{"id", 3}).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(g.Slice{"id", 3, "nickname", "name_3"}).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) // slice parameter gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("id=? and nickname=?", g.Slice{3, "name_3"}).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) // map like gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(g.Map{ "passport like": "user_1%", }).Order("id asc").All() t.AssertNil(err) t.Assert(len(result), 2) t.Assert(result[0].GMap().Get("id"), 1) t.Assert(result[1].GMap().Get("id"), 10) }) // map + slice parameter gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(g.Map{ "id": g.Slice{1, 2, 3}, "passport": g.Slice{"user_2", "user_3"}, }).Where("id=? and nickname=?", g.Slice{3, "name_3"}).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(g.Map{ "id": g.Slice{1, 2, 3}, "passport": g.Slice{"user_2", "user_3"}, }).WhereOr("nickname=?", g.Slice{"name_4"}).Where("id", 3).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 2) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("id=3", g.Slice{}).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("id=?", g.Slice{3}).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("id", 3).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("id", 3).Where("nickname", "name_3").One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("id", 30).WhereOr("nickname", "name_3").One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("id", 30).WhereOr("nickname", "name_3").Where("id>?", 1).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("id", 30).WhereOr("nickname", "name_3").Where("id>", 1).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // slice gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("id=? AND nickname=?", g.Slice{3, "name_3"}...).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("id=? AND nickname=?", g.Slice{3, "name_3"}).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("passport like ? and nickname like ?", g.Slice{"user_3", "name_3"}).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // map gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(g.Map{"id": 3, "nickname": "name_3"}).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // map key operator gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(g.Map{"id>": 1, "id<": 3}).One() t.AssertNil(err) t.Assert(result["id"].Int(), 2) }) // gmap.Map gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(gmap.NewFrom(g.MapAnyAny{"id": 3, "nickname": "name_3"})).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // gmap.Map key operator gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(gmap.NewFrom(g.MapAnyAny{"id>": 1, "id<": 3})).One() t.AssertNil(err) t.Assert(result["id"].Int(), 2) }) // list map gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(gmap.NewListMapFrom(g.MapAnyAny{"id": 3, "nickname": "name_3"})).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // list map key operator gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(gmap.NewListMapFrom(g.MapAnyAny{"id>": 1, "id<": 3})).One() t.AssertNil(err) t.Assert(result["id"].Int(), 2) }) // tree map gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(gmap.NewTreeMapFrom(gutil.ComparatorString, g.MapAnyAny{"id": 3, "nickname": "name_3"})).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // tree map key operator gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(gmap.NewTreeMapFrom(gutil.ComparatorString, g.MapAnyAny{"id>": 1, "id<": 3})).One() t.AssertNil(err) t.Assert(result["id"].Int(), 2) }) // complicated where 1 gtest.C(t, func(t *gtest.T) { conditions := g.Map{ "nickname like ?": "%name%", "id between ? and ?": g.Slice{1, 3}, "id > 0": nil, "create_time IS NOT NULL": nil, "id": g.Slice{1, 2, 3}, } result, err := db.Model(table).Where(conditions).Order("id asc").All() t.AssertNil(err) t.Assert(len(result), 3) t.Assert(result[0]["id"].Int(), 1) }) // complicated where 2 gtest.C(t, func(t *gtest.T) { conditions := g.Map{ "nickname like ?": "%name%", "id between ? and ?": g.Slice{1, 3}, "id >= ?": 1, "create_time > ?": "1970-01-01", "id in(?)": g.Slice{1, 2, 3}, } result, err := db.Model(table).Where(conditions).Order("id asc").All() t.AssertNil(err) t.Assert(len(result), 3) t.Assert(result[0]["id"].Int(), 1) }) // struct, automatic mapping and filtering. gtest.C(t, func(t *gtest.T) { type User struct { Id int Nickname string } result, err := db.Model(table).Where(User{3, "name_3"}).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) result, err = db.Model(table).Where(&User{3, "name_3"}).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // slice single gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("id IN(?)", g.Slice{1, 3}).Order("id ASC").All() t.AssertNil(err) t.Assert(len(result), 2) t.Assert(result[0]["id"].Int(), 1) t.Assert(result[1]["id"].Int(), 3) }) // slice + string gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("nickname=? AND id IN(?)", "name_3", g.Slice{1, 3}).Order("id ASC").All() t.AssertNil(err) t.Assert(len(result), 1) t.Assert(result[0]["id"].Int(), 3) }) // slice + map gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(g.Map{ "id": g.Slice{1, 3}, "nickname": "name_3", }).Order("id ASC").All() t.AssertNil(err) t.Assert(len(result), 1) t.Assert(result[0]["id"].Int(), 3) }) // slice + struct gtest.C(t, func(t *gtest.T) { type User struct { Ids []int `json:"id"` Nickname string `gconv:"nickname"` } result, err := db.Model(table).Where(User{ Ids: []int{1, 3}, Nickname: "name_3", }).Order("id ASC").All() t.AssertNil(err) t.Assert(len(result), 1) t.Assert(result[0]["id"].Int(), 3) }) } func Test_Model_WherePri(t *testing.T) { table := createInitTable() defer dropTable(table) // primary key gtest.C(t, func(t *gtest.T) { one, err := db.Model(table).WherePri(3).One() t.AssertNil(err) t.AssertNE(one, nil) t.Assert(one["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { all, err := db.Model(table).WherePri(g.Slice{3, 9}).Order("id asc").All() t.AssertNil(err) t.Assert(len(all), 2) t.Assert(all[0]["id"].Int(), 3) t.Assert(all[1]["id"].Int(), 9) }) // string gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("id=? and nickname=?", 3, "name_3").One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) // slice parameter gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("id=? and nickname=?", g.Slice{3, "name_3"}).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) // map like gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri(g.Map{ "passport like": "user_1%", }).Order("id asc").All() t.AssertNil(err) t.Assert(len(result), 2) t.Assert(result[0].GMap().Get("id"), 1) t.Assert(result[1].GMap().Get("id"), 10) }) // map + slice parameter gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri(g.Map{ "id": g.Slice{1, 2, 3}, "passport": g.Slice{"user_2", "user_3"}, }).Where("id=? and nickname=?", g.Slice{3, "name_3"}).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri(g.Map{ "id": g.Slice{1, 2, 3}, "passport": g.Slice{"user_2", "user_3"}, }).WhereOr("nickname=?", g.Slice{"name_4"}).Where("id", 3).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 2) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("id=3", g.Slice{}).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("id=?", g.Slice{3}).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("id", 3).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("id", 3).WherePri("nickname", "name_3").One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("id", 3).Where("nickname", "name_3").One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("id", 30).WhereOr("nickname", "name_3").One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("id", 30).WhereOr("nickname", "name_3").Where("id>?", 1).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("id", 30).WhereOr("nickname", "name_3").Where("id>", 1).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // slice gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("id=? AND nickname=?", g.Slice{3, "name_3"}...).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("id=? AND nickname=?", g.Slice{3, "name_3"}).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("passport like ? and nickname like ?", g.Slice{"user_3", "name_3"}).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // map gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri(g.Map{"id": 3, "nickname": "name_3"}).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // map key operator gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri(g.Map{"id>": 1, "id<": 3}).One() t.AssertNil(err) t.Assert(result["id"].Int(), 2) }) // gmap.Map gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri(gmap.NewFrom(g.MapAnyAny{"id": 3, "nickname": "name_3"})).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // gmap.Map key operator gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri(gmap.NewFrom(g.MapAnyAny{"id>": 1, "id<": 3})).One() t.AssertNil(err) t.Assert(result["id"].Int(), 2) }) // list map gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri(gmap.NewListMapFrom(g.MapAnyAny{"id": 3, "nickname": "name_3"})).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // list map key operator gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri(gmap.NewListMapFrom(g.MapAnyAny{"id>": 1, "id<": 3})).One() t.AssertNil(err) t.Assert(result["id"].Int(), 2) }) // tree map gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri(gmap.NewTreeMapFrom(gutil.ComparatorString, g.MapAnyAny{"id": 3, "nickname": "name_3"})).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // tree map key operator gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri(gmap.NewTreeMapFrom(gutil.ComparatorString, g.MapAnyAny{"id>": 1, "id<": 3})).One() t.AssertNil(err) t.Assert(result["id"].Int(), 2) }) // complicated where 1 gtest.C(t, func(t *gtest.T) { conditions := g.Map{ "nickname like ?": "%name%", "id between ? and ?": g.Slice{1, 3}, "id > 0": nil, "create_time IS NOT NULL": nil, "id": g.Slice{1, 2, 3}, } result, err := db.Model(table).WherePri(conditions).Order("id asc").All() t.AssertNil(err) t.Assert(len(result), 3) t.Assert(result[0]["id"].Int(), 1) }) // complicated where 2 gtest.C(t, func(t *gtest.T) { conditions := g.Map{ "nickname like ?": "%name%", "id between ? and ?": g.Slice{1, 3}, "id >= ?": 1, "create_time > ?": "1970-01-01", "id in(?)": g.Slice{1, 2, 3}, } result, err := db.Model(table).WherePri(conditions).Order("id asc").All() t.AssertNil(err) t.Assert(len(result), 3) t.Assert(result[0]["id"].Int(), 1) }) // struct gtest.C(t, func(t *gtest.T) { type User struct { Id int `json:"id"` Nickname string `gconv:"nickname"` } result, err := db.Model(table).WherePri(User{3, "name_3"}).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) result, err = db.Model(table).WherePri(&User{3, "name_3"}).One() t.AssertNil(err) t.Assert(result["id"].Int(), 3) }) // slice single gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("id IN(?)", g.Slice{1, 3}).Order("id ASC").All() t.AssertNil(err) t.Assert(len(result), 2) t.Assert(result[0]["id"].Int(), 1) t.Assert(result[1]["id"].Int(), 3) }) // slice + string gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri("nickname=? AND id IN(?)", "name_3", g.Slice{1, 3}).Order("id ASC").All() t.AssertNil(err) t.Assert(len(result), 1) t.Assert(result[0]["id"].Int(), 3) }) // slice + map gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WherePri(g.Map{ "id": g.Slice{1, 3}, "nickname": "name_3", }).Order("id ASC").All() t.AssertNil(err) t.Assert(len(result), 1) t.Assert(result[0]["id"].Int(), 3) }) // slice + struct gtest.C(t, func(t *gtest.T) { type User struct { Ids []int `json:"id"` Nickname string `gconv:"nickname"` } result, err := db.Model(table).WherePri(User{ Ids: []int{1, 3}, Nickname: "name_3", }).Order("id ASC").All() t.AssertNil(err) t.Assert(len(result), 1) t.Assert(result[0]["id"].Int(), 3) }) } func Test_Model_Where_OmitEmpty(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { conditions := g.Map{ "id < 4": "", } result, err := db.Model(table).Where(conditions).Order("id desc").All() t.AssertNil(err) t.Assert(len(result), 3) t.Assert(result[0]["id"].Int(), 3) }) gtest.C(t, func(t *gtest.T) { conditions := g.Map{ "id < 4": "", } result, err := db.Model(table).Where(conditions).OmitEmpty().Order("id desc").All() t.AssertNil(err) t.Assert(len(result), 10) t.Assert(result[0]["id"].Int(), 10) }) } func Test_Model_WhereLT(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereLT("id", 3).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 2) t.Assert(result[0]["id"], 1) }) } func Test_Model_WhereLTE(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereLTE("id", 3).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 3) t.Assert(result[0]["id"], 1) }) } func Test_Model_WhereGT(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereGT("id", 8).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 2) t.Assert(result[0]["id"], 9) }) } func Test_Model_WhereGTE(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereGTE("id", 8).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 3) t.Assert(result[0]["id"], 8) }) } func Test_Model_WhereOrLT(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereLT("id", 3).WhereOrLT("id", 4).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 3) t.Assert(result[0]["id"], 1) t.Assert(result[2]["id"], 3) }) } func Test_Model_WhereOrLTE(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereLTE("id", 3).WhereOrLTE("id", 4).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 4) t.Assert(result[0]["id"], 1) t.Assert(result[3]["id"], 4) }) } func Test_Model_WhereOrGT(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereGT("id", 8).WhereOrGT("id", 7).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 3) t.Assert(result[0]["id"], 8) }) } func Test_Model_WhereOrGTE(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereGTE("id", 8).WhereOrGTE("id", 7).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 4) t.Assert(result[0]["id"], 7) }) } func Test_Model_WhereIn(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereIn("id", g.Slice{1, 2, 3, 4}).WhereIn("id", g.Slice{3, 4, 5}).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 2) t.Assert(result[0]["id"], 3) t.Assert(result[1]["id"], 4) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereIn("id", g.Slice{}).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 0) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).OmitEmptyWhere().WhereIn("id", g.Slice{}).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), TableSize) }) } func Test_Model_WhereNotIn(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereNotIn("id", g.Slice{1, 2, 3, 4}).WhereNotIn("id", g.Slice{3, 4, 5}).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 5) t.Assert(result[0]["id"], 6) t.Assert(result[1]["id"], 7) }) } func Test_Model_WhereOrIn(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereOrIn("id", g.Slice{1, 2, 3, 4}).WhereOrIn("id", g.Slice{3, 4, 5}).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 5) t.Assert(result[0]["id"], 1) t.Assert(result[4]["id"], 5) }) } func Test_Model_WhereOrNotIn(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereOrNotIn("id", g.Slice{1, 2, 3, 4}).WhereOrNotIn("id", g.Slice{3, 4, 5}).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 8) t.Assert(result[0]["id"], 1) t.Assert(result[4]["id"], 7) }) } func Test_Model_WhereBetween(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereBetween("id", 1, 4).WhereBetween("id", 3, 5).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 2) t.Assert(result[0]["id"], 3) t.Assert(result[1]["id"], 4) }) } func Test_Model_WhereNotBetween(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereNotBetween("id", 2, 8).WhereNotBetween("id", 3, 100).OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 1) t.Assert(result[0]["id"], 1) }) } func Test_Model_WhereOrBetween(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereOrBetween("id", 1, 4).WhereOrBetween("id", 3, 5).OrderDesc("id").All() t.AssertNil(err) t.Assert(len(result), 5) t.Assert(result[0]["id"], 5) t.Assert(result[4]["id"], 1) }) } func Test_Model_WhereOrNotBetween(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereOrNotBetween("id", 1, 4).WhereOrNotBetween("id", 3, 5).OrderDesc("id").All() t.AssertNil(err) t.Assert(len(result), 8) t.Assert(result[0]["id"], 10) t.Assert(result[4]["id"], 6) }) } func Test_Model_WhereLike(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereLike("nickname", "name%").OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), TableSize) t.Assert(result[0]["id"], 1) t.Assert(result[TableSize-1]["id"], TableSize) }) } func Test_Model_WhereNotLike(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereNotLike("nickname", "name%").OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 0) }) } func Test_Model_WhereOrLike(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereOrLike("nickname", "namexxx%").WhereOrLike("nickname", "name%").OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), TableSize) t.Assert(result[0]["id"], 1) t.Assert(result[TableSize-1]["id"], TableSize) }) } func Test_Model_WhereOrNotLike(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereOrNotLike("nickname", "namexxx%").WhereOrNotLike("nickname", "name%").OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), TableSize) t.Assert(result[0]["id"], 1) t.Assert(result[TableSize-1]["id"], TableSize) }) } func Test_Model_WhereNull(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereNull("nickname").WhereNull("passport").OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 0) }) } func Test_Model_WhereNotNull(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereNotNull("nickname").WhereNotNull("passport").OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), TableSize) t.Assert(result[0]["id"], 1) t.Assert(result[TableSize-1]["id"], TableSize) }) } func Test_Model_WhereOrNull(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereOrNull("nickname").WhereOrNull("passport").OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), 0) }) } func Test_Model_WhereOrNotNull(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).WhereOrNotNull("nickname").WhereOrNotNull("passport").OrderAsc("id").All() t.AssertNil(err) t.Assert(len(result), TableSize) t.Assert(result[0]["id"], 1) t.Assert(result[TableSize-1]["id"], TableSize) }) } func Test_Model_Where_MultiSliceArguments(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { r, err := db.Model(table).Where(g.Map{ "id": g.Slice{1, 2, 3, 4}, "passport": g.Slice{"user_2", "user_3", "user_4"}, "nickname": g.Slice{"name_2", "name_4"}, "id >= 4": nil, }).All() t.AssertNil(err) t.Assert(len(r), 1) t.Assert(r[0]["id"], 4) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where(g.Map{ "id": g.Slice{1, 2, 3}, "passport": g.Slice{"user_2", "user_3"}, }).WhereOr("nickname=?", g.Slice{"name_4"}).Where("id", 3).One() t.AssertNil(err) t.AssertGT(len(result), 0) t.Assert(result["id"].Int(), 2) }) } func Test_Model_Where_ISNULL(t *testing.T) { // Create a custom table with nullable nickname column for this test table := fmt.Sprintf(`%s_%d`, TablePrefix+"nullable", gtime.TimestampNano()) if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id bigserial NOT NULL, passport varchar(45), password varchar(32), nickname varchar(45), create_time timestamp, PRIMARY KEY (id) ) ;`, table, )); err != nil { gtest.Fatal(err) } defer dropTable(table) // Insert test data for i := 1; i <= TableSize; i++ { if _, err := db.Insert(ctx, table, 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(CreateTime).String(), }); err != nil { gtest.Fatal(err) } } gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Data("nickname", nil).Where("id", 2).Update() t.AssertNil(err) n, _ := result.RowsAffected() t.Assert(n, 1) one, err := db.Model(table).Where("nickname", nil).One() t.AssertNil(err) t.Assert(one.IsEmpty(), false) t.Assert(one["id"], 2) }) } func Test_Model_Where_GTime(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("create_time>?", gtime.NewFromStr("2010-09-01")).All() t.AssertNil(err) t.Assert(len(result), 10) }) gtest.C(t, func(t *gtest.T) { result, err := db.Model(table).Where("create_time>?", *gtime.NewFromStr("2010-09-01")).All() t.AssertNil(err) t.Assert(len(result), 10) }) } func Test_Model_WhereExists(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { // Create another table for exists subquery table2 := "table2_" + gtime.TimestampNanoStr() sqlCreate := fmt.Sprintf(` CREATE TABLE %s ( id bigserial NOT NULL, uid int NOT NULL DEFAULT 0, PRIMARY KEY (id) );`, table2) if _, err := db.Exec(ctx, sqlCreate); err != nil { t.AssertNil(err) } defer dropTable(table2) // Insert test data _, err := db.Model(table2).Insert(g.List{ {"uid": 1}, {"uid": 2}, }) t.AssertNil(err) // Test WhereExists with subquery subQuery1 := db.Model(table2). Fields("id"). Where("uid = ?", db.Raw("\"user\".id")) r, err := db.Model(table + " as \"user\""). WhereExists(subQuery1). Order("id asc"). All() t.AssertNil(err) t.Assert(len(r), 2) t.Assert(r[0]["id"].Int(), 1) t.Assert(r[1]["id"].Int(), 2) // Test WhereNotExists r, err = db.Model(table + " as \"user\""). WhereNotExists(subQuery1). Order("id asc"). All() t.AssertNil(err) t.Assert(len(r), 8) t.Assert(r[0]["id"].Int(), 3) // Test WhereExists with empty result subQuery2 := db.Model(table2). Fields("id"). Where("uid = -1") r, err = db.Model(table). WhereExists(subQuery2). All() t.AssertNil(err) t.Assert(len(r), 0) // Test WhereNotExists with all results r, err = db.Model(table). WhereNotExists(subQuery2). All() t.AssertNil(err) t.Assert(len(r), 10) // Test combination of Where and WhereExists r, err = db.Model(table+" as \"user\""). Where("id>?", 3). WhereExists(subQuery1). Order("id asc"). All() t.AssertNil(err) t.Assert(len(r), 0) // Test WhereExists with complex subquery subQuery3 := db.Model(table2). Fields("id"). Where("uid = ?", db.Raw("\"user\".id")). Where("id > ?", 0) r, err = db.Model(table + " as \"user\""). WhereExists(subQuery3). Order("id asc"). All() t.AssertNil(err) t.Assert(len(r), 2) t.Assert(r[0]["id"].Int(), 1) t.Assert(r[1]["id"].Int(), 2) // Test WhereExists with Fields r, err = db.Model(table + " as \"user\""). Fields("id,passport"). WhereExists(subQuery1). Order("id asc"). All() t.AssertNil(err) t.Assert(len(r), 2) t.Assert(r[0]["id"].Int(), 1) t.Assert(r[0]["passport"].String(), "user_1") // Test WhereExists with Group r, err = db.Model(table + " as \"user\""). WhereExists(subQuery1). Group("id"). Order("id asc"). All() t.AssertNil(err) t.Assert(len(r), 2) t.Assert(r[0]["id"].Int(), 1) t.Assert(r[1]["id"].Int(), 2) // Test WhereExists with Having r, err = db.Model(table+" as \"user\""). WhereExists(subQuery1). Group("id"). Having("id > ?", 1). Order("id asc"). All() t.AssertNil(err) t.Assert(len(r), 1) t.Assert(r[0]["id"].Int(), 2) }) } func Test_Model_WhereNotExists(t *testing.T) { table := createInitTable() defer dropTable(table) gtest.C(t, func(t *gtest.T) { // Create another table for exists subquery table2 := "table2_" + gtime.TimestampNanoStr() sqlCreate := fmt.Sprintf(` CREATE TABLE %s ( id bigserial NOT NULL, uid int NOT NULL DEFAULT 0, PRIMARY KEY (id) );`, table2) if _, err := db.Exec(ctx, sqlCreate); err != nil { t.AssertNil(err) } defer dropTable(table2) // Insert test data _, err := db.Model(table2).Insert(g.List{ {"uid": 1}, {"uid": 2}, }) t.AssertNil(err) // Test WhereNotExists with subquery subQuery1 := db.Model(table2). Fields("id"). Where("uid = ?", db.Raw("\"user\".id")) r, err := db.Model(table + " as \"user\""). WhereNotExists(subQuery1). Order("id asc"). All() t.AssertNil(err) t.Assert(len(r), 8) t.Assert(r[0]["id"].Int(), 3) t.Assert(r[1]["id"].Int(), 4) // Test WhereNotExists with empty subquery subQuery2 := db.Model(table2). Fields("id"). Where("uid = -1") r, err = db.Model(table + " as \"user\""). WhereNotExists(subQuery2). Order("id asc"). All() t.AssertNil(err) t.Assert(len(r), 10) // Test WhereNotExists with complex condition subQuery3 := db.Model(table2). Fields("id"). Where("uid = ?", db.Raw("\"user\".id")). Where("id > ?", 1) r, err = db.Model(table + " as \"user\""). WhereNotExists(subQuery3). Order("id asc"). All() t.AssertNil(err) t.Assert(len(r), 9) t.Assert(r[0]["id"].Int(), 1) }) } func Test_Model_WherePrefix(t *testing.T) { var ( table1 = "table1_" + gtime.TimestampNanoStr() table2 = "table2_" + gtime.TimestampNanoStr() ) createInitTable(table1) defer dropTable(table1) createInitTable(table2) defer dropTable(table2) gtest.C(t, func(t *gtest.T) { r, err := db.Model(table1). FieldsPrefix(table1, "*"). LeftJoinOnField(table2, "id"). WherePrefix(table2, g.Map{ "id": 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") }) } func Test_Model_WhereOrPrefix(t *testing.T) { var ( table1 = "table1_" + gtime.TimestampNanoStr() table2 = "table2_" + gtime.TimestampNanoStr() ) createInitTable(table1) defer dropTable(table1) createInitTable(table2) defer dropTable(table2) gtest.C(t, func(t *gtest.T) { r, err := db.Model(table1). FieldsPrefix(table1, "*"). LeftJoinOnField(table2, "id"). WhereOrPrefix(table1, g.Map{ "id": g.Slice{1, 2}, }). WhereOrPrefix(table2, g.Map{ "id": g.Slice{8, 9}, }). Order("id asc").All() t.AssertNil(err) t.Assert(len(r), 4) t.Assert(r[0]["id"], "1") t.Assert(r[1]["id"], "2") t.Assert(r[2]["id"], "8") t.Assert(r[3]["id"], "9") }) } func Test_Model_WherePrefixLike(t *testing.T) { var ( table1 = "table1_" + gtime.TimestampNanoStr() table2 = "table2_" + gtime.TimestampNanoStr() ) createInitTable(table1) defer dropTable(table1) createInitTable(table2) defer dropTable(table2) gtest.C(t, func(t *gtest.T) { r, err := db.Model(table1). FieldsPrefix(table1, "*"). LeftJoinOnField(table2, "id"). WherePrefix(table1, g.Map{ "id": g.Slice{1, 2, 3}, }). WherePrefix(table2, g.Map{ "id": g.Slice{3, 4, 5}, }). WherePrefixLike(table2, "nickname", "name%"). Order("id asc").All() t.AssertNil(err) t.Assert(len(r), 1) t.Assert(r[0]["id"], "3") }) }