2022-06-06 19:57:53 +08:00
// 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 sqlite_test
import (
"bytes"
"context"
"database/sql"
"fmt"
"os"
"testing"
"time"
2025-04-10 14:12:35 +08:00
"github.com/gogf/gf/v3/container/garray"
"github.com/gogf/gf/v3/container/gmap"
"github.com/gogf/gf/v3/container/gvar"
"github.com/gogf/gf/v3/database/gdb"
"github.com/gogf/gf/v3/encoding/gjson"
"github.com/gogf/gf/v3/errors/gcode"
"github.com/gogf/gf/v3/errors/gerror"
"github.com/gogf/gf/v3/frame/g"
"github.com/gogf/gf/v3/os/glog"
"github.com/gogf/gf/v3/os/gtime"
"github.com/gogf/gf/v3/test/gtest"
"github.com/gogf/gf/v3/text/gstr"
"github.com/gogf/gf/v3/util/guid"
"github.com/gogf/gf/v3/util/gutil"
2022-06-06 19:57:53 +08:00
)
func Test_Model_Insert ( t * testing . T ) {
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 ( ) ,
2025-05-06 20:08:27 +08:00
} ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
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 ( ) ,
2025-05-06 20:08:27 +08:00
} ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
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" ,
CreateTime : gtime . Now ( ) ,
2025-05-06 20:08:27 +08:00
} ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ = result . RowsAffected ( )
t . Assert ( n , 1 )
2025-05-06 20:08:27 +08:00
value , err := db . Model ( table ) . Fields ( "passport" ) . Where ( "id=3" ) . Value ( ctx )
2022-06-06 19:57:53 +08:00
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 ( ) ,
2025-05-06 20:08:27 +08:00
} ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ = result . RowsAffected ( )
t . Assert ( n , 1 )
2025-05-06 20:08:27 +08:00
value , err = db . Model ( table ) . Fields ( "passport" ) . Where ( "id=4" ) . Value ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( value . String ( ) , "t4" )
2025-05-06 20:08:27 +08:00
result , err = db . Model ( table ) . Where ( "id>?" , 1 ) . Delete ( ctx )
2022-06-06 19:57:53 +08:00
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 ( ) ,
}
2025-05-06 20:08:27 +08:00
_ , err := db . Model ( table ) . Data ( data ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Where ( "id" , 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 )
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" ,
}
2025-05-06 20:08:27 +08:00
_ , err := db . Model ( table ) . Data ( data ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . WherePri ( 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 )
gtest . C ( t , func ( t * gtest . T ) {
type User struct {
Id int
Passport string
Password string
Nickname string
CreateTime string
}
data := User {
Id : 999999 ,
Passport : "user_10" ,
Password : "pass_10" ,
Nickname : "name_10" ,
CreateTime : "2020-10-10 12:00:01" ,
}
2025-05-06 20:08:27 +08:00
_ , err := db . Model ( table ) . Data ( data ) . Where ( "id" , 1 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Where ( "id" , data . Id ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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" ,
}
2025-05-06 20:08:27 +08:00
_ , err := db . Model ( table ) . Data ( data ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Where ( "id" , 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 ( ) ,
} )
}
2025-05-06 20:08:27 +08:00
result , err := user . Data ( array ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := result . LastInsertId ( )
t . Assert ( n , TableSize )
} )
}
func Test_Model_InsertIgnore ( t * testing . T ) {
table := createTable ( )
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" : CreateTime ,
2025-05-06 20:08:27 +08:00
} ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
} )
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" : CreateTime ,
2025-05-06 20:08:27 +08:00
} ) . InsertIgnore ( ctx )
2022-06-06 19:57:53 +08:00
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 ( ) ,
} ,
2025-05-06 20:08:27 +08:00
} ) . Batch ( 1 ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
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" , "password" : "25d55ad283aa400af464c76d713c07ad" , "nickname" : "name" , "create_time" : gtime . Now ( ) . String ( ) } ,
{ "passport" : "t2" , "password" : "25d55ad283aa400af464c76d713c07ad" , "nickname" : "name" , "create_time" : gtime . Now ( ) . String ( ) } ,
{ "passport" : "t3" , "password" : "25d55ad283aa400af464c76d713c07ad" , "nickname" : "name" , "create_time" : gtime . Now ( ) . String ( ) } ,
{ "passport" : "t4" , "password" : "25d55ad283aa400af464c76d713c07ad" , "nickname" : "name" , "create_time" : gtime . Now ( ) . String ( ) } ,
{ "passport" : "t5" , "password" : "25d55ad283aa400af464c76d713c07ad" , "nickname" : "name" , "create_time" : gtime . Now ( ) . String ( ) } ,
2025-05-06 20:08:27 +08:00
} ) . Batch ( 2 ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
if err != nil {
gtest . Error ( err )
}
n , _ := result . RowsAffected ( )
t . Assert ( n , 5 )
} )
// batch replace
gtest . C ( t , func ( t * gtest . T ) {
table := createInitTable ( )
defer dropTable ( table )
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , TableSize )
for _ , v := range result {
v [ "nickname" ] . Set ( v [ "nickname" ] . String ( ) + v [ "id" ] . String ( ) )
v [ "id" ] . Set ( v [ "id" ] . Int ( ) + 100 )
}
2025-05-06 20:08:27 +08:00
r , e := db . Model ( table ) . Data ( result ) . Replace ( ctx )
2022-06-06 19:57:53 +08:00
t . Assert ( e , nil )
n , e := r . RowsAffected ( )
t . Assert ( e , nil )
t . Assert ( n , TableSize )
} )
}
func Test_Model_Replace ( t * testing . T ) {
table := createInitTable ( )
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" : CreateTime ,
2025-05-06 20:08:27 +08:00
} ) . Replace ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := result . RowsAffected ( )
t . Assert ( n , 1 )
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Where ( "id" , 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( one [ "id" ] . Int ( ) , 1 )
t . Assert ( one [ "passport" ] . String ( ) , "t11" )
t . Assert ( one [ "password" ] . String ( ) , "25d55ad283aa400af464c76d713c07ad" )
t . Assert ( one [ "nickname" ] . String ( ) , "T11" )
t . Assert ( one [ "create_time" ] . GTime ( ) . String ( ) , CreateTime )
} )
}
func Test_Model_Save ( t * testing . T ) {
table := createTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2024-03-06 19:22:58 +08:00
type User struct {
Id int
Passport string
Password string
NickName string
CreateTime * gtime . Time
}
var (
user User
count int
result sql . Result
err error
)
result , err = db . Model ( table ) . Data ( g . Map {
2022-06-06 19:57:53 +08:00
"id" : 1 ,
2024-03-06 19:22:58 +08:00
"passport" : "CN" ,
"password" : "12345678" ,
"nickname" : "oldme" ,
2022-06-06 19:57:53 +08:00
"create_time" : CreateTime ,
2025-05-06 20:08:27 +08:00
} ) . OnConflict ( "id" ) . Save ( ctx )
2024-03-12 20:05:03 +08:00
t . AssertNil ( err )
2024-03-06 19:22:58 +08:00
n , _ := result . RowsAffected ( )
t . Assert ( n , 1 )
2025-05-06 20:08:27 +08:00
err = db . Model ( table ) . Scan ( ctx , & user )
2024-03-12 20:05:03 +08:00
t . AssertNil ( err )
2024-03-06 19:22:58 +08:00
t . Assert ( user . Id , 1 )
t . Assert ( user . Passport , "CN" )
t . Assert ( user . Password , "12345678" )
t . Assert ( user . NickName , "oldme" )
t . Assert ( user . CreateTime . String ( ) , CreateTime )
_ , err = db . Model ( table ) . Data ( g . Map {
"id" : 1 ,
"passport" : "CN" ,
"password" : "abc123456" ,
"nickname" : "to be not to be" ,
"create_time" : CreateTime ,
2025-05-06 20:08:27 +08:00
} ) . OnConflict ( "id" ) . Save ( ctx )
2024-03-06 19:22:58 +08:00
t . AssertNil ( err )
2025-05-06 20:08:27 +08:00
err = db . Model ( table ) . Scan ( ctx , & user )
2024-03-12 20:05:03 +08:00
t . AssertNil ( err )
2024-03-06 19:22:58 +08:00
t . Assert ( user . Passport , "CN" )
t . Assert ( user . Password , "abc123456" )
t . Assert ( user . NickName , "to be not to be" )
t . Assert ( user . CreateTime . String ( ) , CreateTime )
2025-05-06 20:08:27 +08:00
count , err = db . Model ( table ) . Count ( ctx )
2024-03-12 20:05:03 +08:00
t . AssertNil ( err )
2024-03-06 19:22:58 +08:00
t . Assert ( count , 1 )
2022-06-06 19:57:53 +08:00
} )
}
func Test_Model_Update ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
// UPDATE...LIMIT
// gtest.C(t, func(t *gtest.T) {
2025-05-06 20:08:27 +08:00
// result, err := db.Model(table).Data("nickname", "T100").Where(1).Limit(2).Update(ctx)
2022-06-06 19:57:53 +08:00
// t.AssertNil(err)
// n, _ := result.RowsAffected()
// t.Assert(n, 2)
2025-05-06 20:08:27 +08:00
// v1, err := db.Model(table).Fields("nickname").Where("id", 10).Value(ctx)
2022-06-06 19:57:53 +08:00
// t.AssertNil(err)
// t.Assert(v1.String(), "T100")
2025-05-06 20:08:27 +08:00
// v2, err := db.Model(table).Fields("nickname").Where("id", 8).Value(ctx)
2022-06-06 19:57:53 +08:00
// t.AssertNil(err)
// t.Assert(v2.String(), "name_8")
// })
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Data ( "passport" , "user_22" ) . Where ( "passport=?" , "user_2" ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := result . RowsAffected ( )
t . Assert ( n , 1 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Data ( "passport" , "user_2" ) . Where ( "passport='user_22'" ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := result . RowsAffected ( )
t . Assert ( n , 1 )
} )
// Update + Data(string)
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Data ( "passport='user_33'" ) . Where ( "passport='user_3'" ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
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" ,
2025-05-06 20:08:27 +08:00
} ) . Where ( "passport='user_4'" ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
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 ) .
2025-05-06 20:08:27 +08:00
UpdateAndGetAffected ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( n , TableSize )
} )
}
func Test_Model_Clone ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
md := db . Model ( table ) . Where ( "id IN(?)" , g . Slice { 1 , 3 } )
count , err := md . Clone ( ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2025-05-06 20:08:27 +08:00
record , err := md . Clone ( ) . Order ( "id DESC" ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2025-05-06 20:08:27 +08:00
result , err := md . Clone ( ) . Order ( "id ASC" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( 2 ) )
2022-06-06 19:57:53 +08:00
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_All ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , TableSize )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id<0" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . Assert ( result , nil )
t . AssertNil ( err )
} )
}
2023-06-01 21:33:40 +08:00
func Test_Model_AllAndCount ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
tableName2 := "user_" + gtime . Now ( ) . TimestampNanoStr ( )
if _ , err := db . Exec ( ctx , fmt . Sprintf ( `
CREATE TABLE % s (
id INTEGER PRIMARY KEY AUTOINCREMENT
UNIQUE
NOT NULL ,
name varchar ( 45 ) NULL ,
age int ( 10 )
) ;
` , 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 )
// AllAndCount with all data
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , count , err := db . Model ( table ) . AllAndCount ( ctx , false )
2023-06-01 21:33:40 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , TableSize )
t . Assert ( count , TableSize )
} )
2024-10-21 09:22:31 +08:00
2023-06-01 21:33:40 +08:00
// AllAndCount with no data
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , count , err := db . Model ( table ) . Where ( "id<0" ) . AllAndCount ( ctx , false )
2023-06-01 21:33:40 +08:00
t . Assert ( result , nil )
t . AssertNil ( err )
t . Assert ( count , 0 )
} )
// AllAndCount with page
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , count , err := db . Model ( table ) . Page ( 1 , 5 ) . AllAndCount ( ctx , false )
2023-06-01 21:33:40 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , 5 )
t . Assert ( count , TableSize )
} )
// AllAndCount with normal result
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , count , err := db . Model ( table ) . Where ( "id=?" , 1 ) . AllAndCount ( ctx , false )
2023-06-01 21:33:40 +08:00
t . AssertNil ( err )
t . Assert ( count , 1 )
t . Assert ( result [ 0 ] [ "id" ] , 1 )
t . Assert ( result [ 0 ] [ "nickname" ] , "name_1" )
t . Assert ( result [ 0 ] [ "passport" ] , "user_1" )
} )
// AllAndCount with distinct
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , count , err := db . Model ( table ) . Fields ( "DISTINCT nickname" ) . AllAndCount ( ctx , true )
2023-06-01 21:33:40 +08:00
t . AssertNil ( err )
t . Assert ( count , TableSize )
t . Assert ( result [ 0 ] [ "nickname" ] , "name_1" )
t . AssertNil ( result [ 0 ] [ "id" ] )
} )
// AllAndCount with Join
gtest . C ( t , func ( t * gtest . T ) {
all , count , err := db . Model ( table ) . As ( "u1" ) .
LeftJoin ( tableName2 , "u2" , "u2.id=u1.id" ) .
Fields ( "u1.passport,u1.id,u2.name,u2.age" ) .
Where ( "u1.id<2" ) .
2025-05-06 20:08:27 +08:00
AllAndCount ( ctx , false )
2023-06-01 21:33:40 +08:00
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" )
t . Assert ( count , 1 )
} )
// AllAndCount with Join return CodeDbOperationError
gtest . C ( t , func ( t * gtest . T ) {
all , count , err := db . Model ( table ) . As ( "u1" ) .
LeftJoin ( tableName2 , "u2" , "u2.id=u1.id" ) .
Fields ( "u1.passport,u1.id,u2.name,u2.age" ) .
Where ( "u1.id<2" ) .
2025-05-06 20:08:27 +08:00
AllAndCount ( ctx , true )
2023-06-01 21:33:40 +08:00
t . AssertNE ( err , nil )
t . AssertEQ ( gerror . Code ( err ) , gcode . CodeDbOperationError )
t . Assert ( count , 0 )
t . Assert ( all , nil )
} )
}
2022-06-06 19:57:53 +08:00
func Test_Model_Fields ( t * testing . T ) {
tableName1 := createInitTable ( )
defer dropTable ( tableName1 )
tableName2 := "user_" + gtime . Now ( ) . TimestampNanoStr ( )
if _ , err := db . Exec ( ctx , fmt . Sprintf ( `
CREATE TABLE % s (
id INTEGER PRIMARY KEY AUTOINCREMENT
UNIQUE
NOT NULL ,
name varchar ( 45 ) NULL ,
age int ( 10 )
) ;
` , 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 )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
all , err := db . Model ( tableName1 ) . As ( "u" ) . Fields ( "u.passport,u.id" ) . Where ( "u.id<2" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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" ) .
2025-05-06 20:08:27 +08:00
All ( ctx )
2022-06-06 19:57:53 +08:00
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" ) .
2025-05-06 20:08:27 +08:00
All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
record , err := db . Model ( table ) . Where ( "id" , 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( record [ "nickname" ] . String ( ) , "name_1" )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
record , err := db . Model ( table ) . Where ( "id" , 0 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( record , nil )
} )
}
func Test_Model_Value ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
value , err := db . Model ( table ) . Fields ( "nickname" ) . Where ( "id" , 1 ) . Value ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( value . String ( ) , "name_1" )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
value , err := db . Model ( table ) . Fields ( "nickname" ) . Where ( "id" , 0 ) . Value ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( value , nil )
} )
}
func Test_Model_Array ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
all , err := db . Model ( table ) . Where ( "id" , g . Slice { 1 , 2 , 3 } ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
array , err := db . Model ( table ) . Fields ( "nickname" ) . Where ( "id" , g . Slice { 1 , 2 , 3 } ) . Array ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( array , g . Slice { "name_1" , "name_2" , "name_3" } )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
array , err := db . Model ( table ) . Fields ( "nickname" ) . Where ( "id" , g . Slice { 1 , 2 , 3 } ) . Array ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( TableSize ) )
2022-06-06 19:57:53 +08:00
} )
// 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 ,
2025-05-06 20:08:27 +08:00
} ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( TableSize ) )
2022-06-06 19:57:53 +08:00
}
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . FieldsEx ( "id" ) . Where ( "id>8" ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( 2 ) )
2022-06-06 19:57:53 +08:00
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . Fields ( "distinct id" ) . Where ( "id>8" ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( 2 ) )
2022-06-06 19:57:53 +08:00
} )
// COUNT...LIMIT...
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . Page ( 1 , 2 ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( TableSize ) )
2022-06-06 19:57:53 +08:00
} )
}
2024-10-24 15:29:03 +08:00
func Test_Model_Exist ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
exist , err := db . Model ( table ) . Exist ( ctx )
2024-10-24 15:29:03 +08:00
t . AssertNil ( err )
t . Assert ( exist , TableSize > 0 )
2025-05-06 20:08:27 +08:00
exist , err = db . Model ( table ) . Where ( "id" , - 1 ) . Exist ( ctx )
2024-10-24 15:29:03 +08:00
t . AssertNil ( err )
t . Assert ( exist , false )
} )
}
2022-06-06 19:57:53 +08:00
func Test_Model_Select ( t * testing . T ) {
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
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Scan ( ctx , & users )
2022-06-06 19:57:53 +08:00
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 )
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Where ( "id=1" ) . Scan ( ctx , user )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( user . NickName , "name_1" )
t . Assert ( user . CreateTime . String ( ) , CreateTime )
} )
gtest . C ( t , func ( t * gtest . T ) {
type User struct {
Id int
Passport string
Password string
NickName string
CreateTime * gtime . Time
}
user := new ( User )
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Where ( "id=1" ) . Scan ( ctx , user )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( user . NickName , "name_1" )
t . Assert ( user . CreateTime . String ( ) , CreateTime )
} )
// 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 )
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Where ( "id=1" ) . Scan ( ctx , & user )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( user . NickName , "name_1" )
t . Assert ( user . CreateTime . String ( ) , CreateTime )
} )
// 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 )
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Where ( "id=1" ) . Scan ( ctx , & user )
2022-06-06 19:57:53 +08:00
if err != nil {
gtest . Error ( err )
}
t . Assert ( user . NickName , "name_1" )
t . Assert ( user . CreateTime . String ( ) , CreateTime )
} )
// 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 )
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Where ( "id=-1" ) . Scan ( ctx , user )
2022-06-06 19:57:53 +08:00
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
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Where ( "id=-1" ) . Scan ( ctx , & user )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
} )
}
func Test_Model_Struct_CustomType ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
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 )
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Where ( "id=1" ) . Scan ( ctx , user )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( user . NickName , "name_1" )
t . Assert ( user . CreateTime . String ( ) , CreateTime )
} )
}
func Test_Model_Structs ( 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
}
var users [ ] User
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Order ( "id asc" ) . Scan ( ctx , & users )
2022-06-06 19:57:53 +08:00
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 ( ) , CreateTime )
} )
// 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
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Order ( "id asc" ) . Scan ( ctx , & users )
2022-06-06 19:57:53 +08:00
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 ( ) , CreateTime )
} )
// 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
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Order ( "id asc" ) . Scan ( ctx , & users )
2022-06-06 19:57:53 +08:00
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 ( ) , CreateTime )
} )
// 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
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Where ( "id<0" ) . Scan ( ctx , & users )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
} )
}
func Test_Model_StructsWithOrmTag ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
db . SetDebug ( true )
defer db . SetDebug ( false )
type User struct {
Uid int ` orm:"id" `
Passport string
Password string ` orm:"password" `
Name string ` orm:"nickname" `
Time gtime . Time ` orm:"create_time" `
}
var (
users [ ] User
buffer = bytes . NewBuffer ( nil )
)
2022-07-07 21:16:26 +08:00
db . GetLogger ( ) . ( * glog . Logger ) . SetWriter ( buffer )
defer db . GetLogger ( ) . ( * glog . Logger ) . SetWriter ( os . Stdout )
2025-05-06 20:08:27 +08:00
db . Model ( table ) . Order ( "id asc" ) . Scan ( ctx , & users )
2022-06-06 19:57:53 +08:00
// fmt.Println(buffer.String())
t . Assert (
gstr . Contains ( buffer . String ( ) , "SELECT `id`,`passport`,`password`,`nickname`,`create_time` FROM `user" ) ,
true ,
)
} )
gtest . C ( t , func ( t * gtest . T ) {
type A struct {
Passport string
Password string
}
type B struct {
A
NickName string
}
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Fields ( & B { } ) . Where ( "id" , 2 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 )
gtest . C ( t , func ( t * gtest . T ) {
type User struct {
Id int
Passport string
Password string
NickName string
CreateTime gtime . Time
}
user := new ( User )
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Where ( "id=1" ) . Scan ( ctx , user )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( user . NickName , "name_1" )
t . Assert ( user . CreateTime . String ( ) , CreateTime )
} )
gtest . C ( t , func ( t * gtest . T ) {
type User struct {
Id int
Passport string
Password string
NickName string
CreateTime * gtime . Time
}
user := new ( User )
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Where ( "id=1" ) . Scan ( ctx , user )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( user . NickName , "name_1" )
t . Assert ( user . CreateTime . String ( ) , CreateTime )
} )
gtest . C ( t , func ( t * gtest . T ) {
type User struct {
Id int
Passport string
Password string
NickName string
CreateTime gtime . Time
}
var users [ ] User
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Order ( "id asc" ) . Scan ( ctx , & users )
2022-06-06 19:57:53 +08:00
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 ( ) , CreateTime )
} )
gtest . C ( t , func ( t * gtest . T ) {
type User struct {
Id int
Passport string
Password string
NickName string
CreateTime * gtime . Time
}
var users [ ] * User
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Order ( "id asc" ) . Scan ( ctx , & users )
2022-06-06 19:57:53 +08:00
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 ( ) , CreateTime )
} )
// 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 )
)
2025-05-06 20:08:27 +08:00
err1 := db . Model ( table ) . Where ( "id < 0" ) . Scan ( ctx , user )
err2 := db . Model ( table ) . Where ( "id < 0" ) . Scan ( ctx , users )
2022-06-06 19:57:53 +08:00
t . Assert ( err1 , sql . ErrNoRows )
t . Assert ( err2 , nil )
} )
}
2023-06-01 21:33:40 +08:00
func Test_Model_ScanAndCount ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
tableName2 := "user_" + gtime . Now ( ) . TimestampNanoStr ( )
if _ , err := db . Exec ( ctx , fmt . Sprintf ( `
CREATE TABLE % s (
id INTEGER PRIMARY KEY AUTOINCREMENT
UNIQUE
NOT NULL ,
name varchar ( 45 ) NULL ,
age int ( 10 )
) ;
` , 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 )
// ScanAndCount with normal struct result
gtest . C ( t , func ( t * gtest . T ) {
type User struct {
Id int
Passport string
Password string
NickName string
CreateTime * gtime . Time
}
user := new ( User )
var count int
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Where ( "id=1" ) . ScanAndCount ( ctx , user , & count , true )
2023-06-01 21:33:40 +08:00
t . AssertNil ( err )
t . Assert ( user . NickName , "name_1" )
t . Assert ( user . CreateTime . String ( ) , CreateTime )
t . Assert ( count , 1 )
} )
// ScanAndCount with normal array result
gtest . C ( t , func ( t * gtest . T ) {
type User struct {
Id int
Passport string
Password string
NickName string
CreateTime gtime . Time
}
var users [ ] User
var count int
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Order ( "id asc" ) . ScanAndCount ( ctx , & users , & count , true )
2023-06-01 21:33:40 +08:00
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 ( ) , CreateTime )
t . Assert ( count , len ( users ) )
} )
// 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 )
)
var count1 int
var count2 int
2025-05-06 20:08:27 +08:00
err1 := db . Model ( table ) . Where ( "id < 0" ) . ScanAndCount ( ctx , user , & count1 , true )
err2 := db . Model ( table ) . Where ( "id < 0" ) . ScanAndCount ( ctx , users , & count2 , true )
2023-06-01 21:33:40 +08:00
t . Assert ( count1 , 0 )
t . Assert ( count2 , 0 )
t . Assert ( err1 , nil )
t . Assert ( err2 , nil )
} )
// ScanAndCount with page
gtest . C ( t , func ( t * gtest . T ) {
type User struct {
Id int
Passport string
Password string
NickName string
CreateTime gtime . Time
}
var users [ ] User
var count int
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Order ( "id asc" ) . Page ( 1 , 3 ) . ScanAndCount ( ctx , & users , & count , true )
2023-06-01 21:33:40 +08:00
t . AssertNil ( err )
t . Assert ( len ( users ) , 3 )
t . Assert ( count , TableSize )
} )
// ScanAndCount with distinct
gtest . C ( t , func ( t * gtest . T ) {
type User struct {
Id int
Passport string
Password string
NickName string
CreateTime gtime . Time
}
var users [ ] User
var count int
2025-05-06 20:08:27 +08:00
err = db . Model ( table ) . Fields ( "distinct id" ) . ScanAndCount ( ctx , & users , & count , true )
2023-06-01 21:33:40 +08:00
t . AssertNil ( err )
t . Assert ( len ( users ) , 10 )
t . Assert ( count , TableSize )
t . Assert ( users [ 0 ] . Id , 1 )
} )
// ScanAndCount with join
gtest . C ( t , func ( t * gtest . T ) {
type User struct {
Id int
Passport string
Name string
Age int
}
var users [ ] User
var count int
err = db . Model ( table ) . As ( "u1" ) .
LeftJoin ( tableName2 , "u2" , "u2.id=u1.id" ) .
Fields ( "u1.passport,u1.id,u2.name,u2.age" ) .
Where ( "u1.id<2" ) .
2025-05-06 20:08:27 +08:00
ScanAndCount ( ctx , & users , & count , false )
2023-06-01 21:33:40 +08:00
t . AssertNil ( err )
t . Assert ( len ( users ) , 1 )
t . Assert ( count , 1 )
t . AssertEQ ( users [ 0 ] . Name , "table2_1" )
} )
2025-05-06 20:08:27 +08:00
2023-06-01 21:33:40 +08:00
// ScanAndCount with join return CodeDbOperationError
gtest . C ( t , func ( t * gtest . T ) {
type User struct {
Id int
Passport string
Name string
Age int
}
var users [ ] User
var count int
err = db . Model ( table ) . As ( "u1" ) .
LeftJoin ( tableName2 , "u2" , "u2.id=u1.id" ) .
Fields ( "u1.passport,u1.id,u2.name,u2.age" ) .
Where ( "u1.id<2" ) .
2025-05-06 20:08:27 +08:00
ScanAndCount ( ctx , & users , & count , true )
2023-06-01 21:33:40 +08:00
t . AssertNE ( err , nil )
t . Assert ( gerror . Code ( err ) , gcode . CodeDbOperationError )
t . Assert ( count , 0 )
t . AssertEQ ( users , nil )
} )
}
2022-06-06 19:57:53 +08:00
func Test_Model_Scan_NilSliceAttrWhenNoRecordsFound ( t * testing . T ) {
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
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Scan ( ctx , & res . Users )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( res . Users , nil )
} )
}
func Test_Model_OrderBy ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Order ( "id DESC" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Order ( gdb . Raw ( "NULL" ) ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , TableSize )
t . Assert ( result [ 0 ] [ "nickname" ] . String ( ) , "name_1" )
} )
}
func Test_Model_GroupBy ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Group ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 )
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Data ( "nickname=?" , "test" ) . Where ( "id=?" , 3 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
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 ) ,
"create_time" : gtime . Now ( ) . String ( ) ,
} )
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Data ( users ) . Batch ( 2 ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
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 ) ,
"create_time" : gtime . Now ( ) . String ( ) ,
} )
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Data ( users ) . Batch ( 2 ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := result . RowsAffected ( )
t . Assert ( n , 10 )
} )
}
func Test_Model_Where ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
// string
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id=? and nickname=?" , 3 , "name_3" ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// slice
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( g . Slice { "id" , 3 } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( g . Slice { "id" , 3 , "nickname" , "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// slice parameter
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id=? and nickname=?" , g . Slice { 3 , "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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%" ,
2025-05-06 20:08:27 +08:00
} ) . Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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" } ,
2025-05-06 20:08:27 +08:00
} ) . Where ( "id=? and nickname=?" , g . Slice { 3 , "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id=3" , g . Slice { } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id=?" , g . Slice { 3 } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id" , 3 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id" , 3 ) . Where ( "nickname" , "name_3" ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id" , 3 ) . Where ( "nickname" , "name_3" ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id" , 30 ) . WhereOr ( "nickname" , "name_3" ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id" , 30 ) . WhereOr ( "nickname" , "name_3" ) . Where ( "id>?" , 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id" , 30 ) . WhereOr ( "nickname" , "name_3" ) . Where ( "id>" , 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// slice
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id=? AND nickname=?" , g . Slice { 3 , "name_3" } ... ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id=? AND nickname=?" , g . Slice { 3 , "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "passport like ? and nickname like ?" , g . Slice { "user_3" , "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// map
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( g . Map { "id" : 3 , "nickname" : "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// map key operator
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( g . Map { "id>" : 1 , "id<" : 3 } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 2 )
} )
// gmap.Map
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( gmap . NewFrom ( g . MapAnyAny { "id" : 3 , "nickname" : "name_3" } ) ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// gmap.Map key operator
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( gmap . NewFrom ( g . MapAnyAny { "id>" : 1 , "id<" : 3 } ) ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 2 )
} )
// list map
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( gmap . NewListMapFrom ( g . MapAnyAny { "id" : 3 , "nickname" : "name_3" } ) ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// list map key operator
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( gmap . NewListMapFrom ( g . MapAnyAny { "id>" : 1 , "id<" : 3 } ) ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 2 )
} )
// tree map
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( gmap . NewTreeMapFrom ( gutil . ComparatorString , g . MapAnyAny { "id" : 3 , "nickname" : "name_3" } ) ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// tree map key operator
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( gmap . NewTreeMapFrom ( gutil . ComparatorString , g . MapAnyAny { "id>" : 1 , "id<" : 3 } ) ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 2 )
} )
// complicated where 1
gtest . C ( t , func ( t * gtest . T ) {
// db.SetDebug(true)
conditions := g . Map {
"nickname like ?" : "%name%" ,
"id between ? and ?" : g . Slice { 1 , 3 } ,
"id > 0" : nil ,
"create_time > 0" : nil ,
"id" : g . Slice { 1 , 2 , 3 } ,
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( conditions ) . Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
// db.SetDebug(true)
conditions := g . Map {
"nickname like ?" : "%name%" ,
"id between ? and ?" : g . Slice { 1 , 3 } ,
"id >= ?" : 1 ,
"create_time > ?" : 0 ,
"id in(?)" : g . Slice { 1 , 2 , 3 } ,
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( conditions ) . Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( User { 3 , "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
2025-05-06 20:08:27 +08:00
result , err = db . Model ( table ) . Where ( & User { 3 , "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// slice single
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id IN(?)" , g . Slice { 1 , 3 } ) . Order ( "id ASC" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "nickname=? AND id IN(?)" , "name_3" , g . Slice { 1 , 3 } ) . Order ( "id ASC" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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" ,
2025-05-06 20:08:27 +08:00
} ) . Order ( "id ASC" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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" ,
2025-05-06 20:08:27 +08:00
} ) . Order ( "id ASC" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , 1 )
t . Assert ( result [ 0 ] [ "id" ] . Int ( ) , 3 )
} )
}
func Test_Model_Where_ISNULL_1 ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
// db.SetDebug(true)
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Data ( "nickname" , nil ) . Where ( "id" , 2 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := result . RowsAffected ( )
t . Assert ( n , 1 )
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Where ( "nickname" , nil ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( one . IsEmpty ( ) , false )
t . Assert ( one [ "id" ] , 2 )
} )
}
func Test_Model_Where_ISNULL_2 ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
// complicated one.
gtest . C ( t , func ( t * gtest . T ) {
// db.SetDebug(true)
conditions := g . Map {
"nickname like ?" : "%name%" ,
"id between ? and ?" : g . Slice { 1 , 3 } ,
"id > 0" : nil ,
"create_time > 0" : nil ,
"id" : g . Slice { 1 , 2 , 3 } ,
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( conditions ) . Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , 3 )
t . Assert ( result [ 0 ] [ "id" ] . Int ( ) , 1 )
} )
}
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" : "" ,
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( conditions ) . Order ( "id desc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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" : "" ,
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( conditions ) . OmitEmpty ( ) . Order ( "id desc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , 10 )
t . Assert ( result [ 0 ] [ "id" ] . Int ( ) , 10 )
} )
}
func Test_Model_Where_GTime ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "create_time>?" , gtime . NewFromStr ( "2010-09-01" ) ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , 10 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "create_time>?" , * gtime . NewFromStr ( "2010-09-01" ) ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , 10 )
} )
}
func Test_Model_WherePri ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
// primary key
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . WherePri ( 3 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertNE ( one , nil )
t . Assert ( one [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
all , err := db . Model ( table ) . WherePri ( g . Slice { 3 , 9 } ) . Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id=? and nickname=?" , 3 , "name_3" ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// slice parameter
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id=? and nickname=?" , g . Slice { 3 , "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// map like
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( g . Map {
2022-06-06 19:57:53 +08:00
"passport like" : "user_1%" ,
2025-05-06 20:08:27 +08:00
} ) . Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( g . Map {
2022-06-06 19:57:53 +08:00
"id" : g . Slice { 1 , 2 , 3 } ,
"passport" : g . Slice { "user_2" , "user_3" } ,
2025-05-06 20:08:27 +08:00
} ) . Where ( "id=? and nickname=?" , g . Slice { 3 , "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( g . Map {
2022-06-06 19:57:53 +08:00
"id" : g . Slice { 1 , 2 , 3 } ,
"passport" : g . Slice { "user_2" , "user_3" } ,
2025-05-06 20:08:27 +08:00
} ) . WhereOr ( "nickname=?" , g . Slice { "name_4" } ) . Where ( "id" , 3 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 2 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WherePri ( g . Slice { 3 } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WherePri ( 3 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WherePri ( 3 ) . Where ( "nickname" , "name_3" ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WherePri ( 3 ) . Where ( "nickname" , "name_3" ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WherePri ( 30 ) . WhereOr ( "nickname" , "name_3" ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WherePri ( 30 ) . WhereOr ( "nickname" , "name_3" ) . Where ( "id>?" , 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WherePri ( 30 ) . WhereOr ( "nickname" , "name_3" ) . Where ( "id>" , 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// slice
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id=? AND nickname=?" , g . Slice { 3 , "name_3" } ... ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id=? AND nickname=?" , g . Slice { 3 , "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "passport like ? and nickname like ?" , g . Slice { "user_3" , "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// map
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( g . Map { "id" : 3 , "nickname" : "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// map key operator
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( g . Map { "id>" : 1 , "id<" : 3 } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 2 )
} )
// gmap.Map
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( gmap . NewFrom ( g . MapAnyAny { "id" : 3 , "nickname" : "name_3" } ) ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// gmap.Map key operator
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( gmap . NewFrom ( g . MapAnyAny { "id>" : 1 , "id<" : 3 } ) ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 2 )
} )
// list map
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( gmap . NewListMapFrom ( g . MapAnyAny { "id" : 3 , "nickname" : "name_3" } ) ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// list map key operator
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( gmap . NewListMapFrom ( g . MapAnyAny { "id>" : 1 , "id<" : 3 } ) ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 2 )
} )
// tree map
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( gmap . NewTreeMapFrom ( gutil . ComparatorString , g . MapAnyAny { "id" : 3 , "nickname" : "name_3" } ) ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// tree map key operator
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( gmap . NewTreeMapFrom ( gutil . ComparatorString , g . MapAnyAny { "id>" : 1 , "id<" : 3 } ) ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 2 )
} )
// complicated where 1
gtest . C ( t , func ( t * gtest . T ) {
// db.SetDebug(true)
conditions := g . Map {
"nickname like ?" : "%name%" ,
"id between ? and ?" : g . Slice { 1 , 3 } ,
"id > 0" : nil ,
"create_time > 0" : nil ,
"id" : g . Slice { 1 , 2 , 3 } ,
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( conditions ) . Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
// db.SetDebug(true)
conditions := g . Map {
"nickname like ?" : "%name%" ,
"id between ? and ?" : g . Slice { 1 , 3 } ,
"id >= ?" : 1 ,
"create_time > ?" : 0 ,
"id in(?)" : g . Slice { 1 , 2 , 3 } ,
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( conditions ) . Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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" `
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( User { 3 , "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
2025-05-06 20:08:27 +08:00
result , err = db . Model ( table ) . Where ( & User { 3 , "name_3" } ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result [ "id" ] . Int ( ) , 3 )
} )
// slice single
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WherePri ( g . Slice { 1 , 3 } ) . Order ( "id ASC" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "nickname=? AND id IN(?)" , "name_3" , g . Slice { 1 , 3 } ) . Order ( "id ASC" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , 1 )
t . Assert ( result [ 0 ] [ "id" ] . Int ( ) , 3 )
} )
// slice + map
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( g . Map {
2022-06-06 19:57:53 +08:00
"id" : g . Slice { 1 , 3 } ,
"nickname" : "name_3" ,
2025-05-06 20:08:27 +08:00
} ) . Order ( "id ASC" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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" `
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( User {
2022-06-06 19:57:53 +08:00
Ids : [ ] int { 1 , 3 } ,
Nickname : "name_3" ,
2025-05-06 20:08:27 +08:00
} ) . Order ( "id ASC" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , 1 )
t . Assert ( result [ 0 ] [ "id" ] . Int ( ) , 3 )
} )
}
func Test_Model_Delete ( t * testing . T ) {
// table := createInitTable()
// defer dropTable(table)
// DELETE...LIMIT
// https://github.com/mattn/go-sqlite3/pull/802
// gtest.C(t, func(t *gtest.T) {
2025-05-06 20:08:27 +08:00
// result, err := db.Model(table).Where(1).Limit(2).Delete(ctx)
2022-06-06 19:57:53 +08:00
// t.AssertNil(err)
// n, _ := result.RowsAffected()
// t.Assert(n, 2)
// })
gtest . C ( t , func ( t * gtest . T ) {
table := createInitTable ( )
defer dropTable ( table )
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( 1 ) . Delete ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := result . RowsAffected ( )
t . Assert ( n , TableSize )
} )
}
func Test_Model_Offset ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Limit ( 2 ) . Offset ( 5 ) . Order ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Page ( 3 , 3 ) . Order ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
model := db . Model ( table ) . Order ( "id" )
all , err := model . Page ( 3 , 3 ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2025-05-06 20:08:27 +08:00
count , err := model . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( all ) , 3 )
t . Assert ( all [ 0 ] [ "id" ] , "7" )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( TableSize ) )
2022-06-06 19:57:53 +08:00
} )
}
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" , "password" , "create_time" ) . Data ( g . Map {
"id" : 1 ,
"passport" : "1" ,
"password" : "1" ,
"nickname" : "1" ,
"create_time" : gtime . Now ( ) . String ( ) ,
2025-05-06 20:08:27 +08:00
} ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := r . RowsAffected ( )
t . Assert ( n , 1 )
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Where ( "id" , 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertNE ( one [ "password" ] . String ( ) , "2" )
t . AssertNE ( one [ "nickname" ] . String ( ) , "2" )
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" : "1" ,
"password" : "1" ,
"nickname" : "" ,
"create_time" : gtime . Now ( ) . String ( ) ,
2025-05-06 20:08:27 +08:00
} ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := r . RowsAffected ( )
t . Assert ( n , 1 )
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Where ( "id" , 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertNE ( one [ "passport" ] . String ( ) , "0" )
t . AssertNE ( one [ "password" ] . String ( ) , "0" )
t . Assert ( one [ "nickname" ] . String ( ) , "" )
} )
// 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" ,
2025-05-06 20:08:27 +08:00
} ) . Replace ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Where ( "id" , 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertNE ( one [ "passport" ] . String ( ) , "0" )
t . AssertNE ( one [ "password" ] . String ( ) , "0" )
t . Assert ( one [ "nickname" ] . String ( ) , "1" )
} )
// Update
gtest . C ( t , func ( t * gtest . T ) {
table := createInitTable ( )
defer dropTable ( table )
2025-05-06 20:08:27 +08:00
r , err := db . Model ( table ) . Data ( g . Map { "nickname" : "" } ) . Where ( "id" , 1 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := r . RowsAffected ( )
t . Assert ( n , 1 )
2025-05-06 20:08:27 +08:00
_ , err = db . Model ( table ) . OmitEmptyData ( ) . Data ( g . Map { "nickname" : "" } ) . Where ( "id" , 2 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNE ( err , nil )
2025-05-06 20:08:27 +08:00
r , err = db . Model ( table ) . OmitEmpty ( ) . Data ( g . Map { "nickname" : "" , "password" : "123" } ) . Where ( "id" , 3 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ = r . RowsAffected ( )
t . Assert ( n , 1 )
2025-05-06 20:08:27 +08:00
_ , err = db . Model ( table ) . OmitEmpty ( ) . Fields ( "nickname" ) . Data ( g . Map { "nickname" : "" , "password" : "123" } ) . Where ( "id" , 4 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNE ( err , nil )
r , err = db . Model ( table ) . OmitEmpty ( ) .
Fields ( "password" ) . Data ( g . Map {
"nickname" : "" ,
"passport" : "123" ,
"password" : "456" ,
2025-05-06 20:08:27 +08:00
} ) . Where ( "id" , 5 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ = r . RowsAffected ( )
t . Assert ( n , 1 )
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Where ( "id" , 5 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( one [ "password" ] , "456" )
t . AssertNE ( one [ "passport" ] . String ( ) , "" )
t . AssertNE ( one [ "passport" ] . String ( ) , "123" )
} )
}
func Test_Model_Option_Where ( t * testing . T ) {
gtest . C ( t , func ( t * gtest . T ) {
table := createInitTable ( )
defer dropTable ( table )
2025-05-06 20:08:27 +08:00
r , err := db . Model ( table ) . OmitEmpty ( ) . Data ( "nickname" , 1 ) . Where ( g . Map { "id" : 0 , "passport" : "" } ) . Where ( 1 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := r . RowsAffected ( )
t . Assert ( n , 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 ,
2025-05-06 20:08:27 +08:00
} ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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" } ,
2025-05-06 20:08:27 +08:00
} ) . WhereOr ( "nickname=?" , g . Slice { "name_4" } ) . Where ( "id" , 3 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . AssertGT ( len ( result ) , 0 )
t . Assert ( result [ "id" ] . Int ( ) , 2 )
} )
}
func Test_Model_FieldsEx ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
// Select.
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
r , err := db . Model ( table ) . FieldsEx ( "create_time, id" ) . Where ( "id in (?)" , g . Slice { 1 , 2 } ) . Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( r ) , 2 )
t . Assert ( len ( r [ 0 ] ) , 3 )
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 ) {
2025-05-06 20:08:27 +08:00
r , err := db . Model ( table ) . FieldsEx ( "password" ) . Data ( g . Map { "nickname" : "123" , "password" : "456" } ) . Where ( "id" , 3 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := r . RowsAffected ( )
t . Assert ( n , 1 )
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Where ( "id" , 3 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( one [ "nickname" ] , "123" )
t . AssertNE ( one [ "password" ] , "456" )
} )
}
func Test_Model_Prefix ( t * testing . T ) {
db := dbPrefix
noPrefixName := fmt . Sprintf ( ` %s_%d ` , TableName , gtime . TimestampNano ( ) )
table := TableNamePrefix + noPrefixName
createInitTableWithDb ( db , table )
defer dropTable ( table )
// Select.
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
r , err := db . Model ( noPrefixName ) . Where ( "id in (?)" , g . Slice { 1 , 2 } ) . Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
r , err := db . Model ( noPrefixName + " as u" ) . Where ( "u.id in (?)" , g . Slice { 1 , 2 } ) . Order ( "u.id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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
2025-05-06 20:08:27 +08:00
err := db . Model ( noPrefixName + " u" ) . Where ( "u.id in (?)" , g . Slice { 1 , 5 } ) . Order ( "u.id asc" ) . Scan ( ctx , & users )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
r , err := db . Model ( noPrefixName + " as u1" ) . LeftJoin ( noPrefixName + " as u2" , "u2.id=u1.id" ) . Where ( "u1.id in (?)" , g . Slice { 1 , 2 } ) . Order ( "u1.id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
r , err := db . Model ( noPrefixName ) . As ( "u1" ) . LeftJoin ( noPrefixName + " as u2" , "u2.id=u1.id" ) . Where ( "u1.id in (?)" , g . Slice { 1 , 2 } ) . Order ( "u1.id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( r ) , 2 )
t . Assert ( r [ 0 ] [ "id" ] , "1" )
t . Assert ( r [ 1 ] [ "id" ] , "2" )
} )
}
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:"passport" json:"pass_port" `
Password string ` orm:"password" json:"password" `
NickName string ` orm:"nickname" json:"nick__name" `
Time time . Time ` orm:"create_time" `
}
user := & User {
Id : 1 ,
Passport : "111" ,
Password : "222" ,
NickName : "333" ,
Time : time . Now ( ) ,
}
2025-05-06 20:08:27 +08:00
r , err := db . Model ( table ) . FieldsEx ( "nickname" ) . OmitEmpty ( ) . Data ( user ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
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:"passport" json:"pass_port" `
Password string ` orm:"password" json:"password" `
NickName string ` orm:"nickname" json:"nick__name" `
Time time . Time ` orm:"create_time" `
}
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 ) ,
Time : time . Now ( ) ,
} )
}
r , err := db . Model ( table ) . FieldsEx ( "nickname" ) .
OmitEmpty ( ) .
Batch ( 2 ) .
Data ( users ) .
2025-05-06 20:08:27 +08:00
Insert ( ctx )
2022-06-06 19:57:53 +08:00
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 { } ,
}
2025-05-06 20:08:27 +08:00
r , err := db . Model ( table ) . OmitEmpty ( ) . Data ( user ) . Where ( "id" , 1 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
r , err := db . Model ( table ) . Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . WherePri ( 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( one [ "id" ] , 1 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
r , err := db . Model ( table ) . Data ( "passport" , "port_1" ) . WherePri ( 1 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
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 )
2025-05-06 20:08:27 +08:00
r , err := db . Model ( table , "t1" ) . Fields ( "t2.id" ) . LeftJoin ( subQuery , "t2" , "t2.id=t1.id" ) . Array ( ctx )
2022-06-06 19:57:53 +08:00
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 )
gtest . C ( t , func ( t * gtest . T ) {
one , err := db . Model ( table ) . Cache ( gdb . CacheOption {
Duration : time . Second ,
Name : "test1" ,
Force : false ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( one [ "passport" ] , "user_1" )
2025-05-06 20:08:27 +08:00
r , err := db . Model ( table ) . Data ( "passport" , "user_100" ) . WherePri ( 1 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( one [ "passport" ] , "user_1" )
time . Sleep ( time . Second * 2 )
one , err = db . Model ( table ) . Cache ( gdb . CacheOption {
Duration : time . Second ,
Name : "test1" ,
Force : false ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 2 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 2 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 2 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 3 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 3 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , err := r . RowsAffected ( )
t . AssertNil ( err )
t . Assert ( n , 1 )
feature/v2.3.0 (#2296)
* up
* rename function names for package gtcp/gudp; add proxy example for gtcp.Server (#2295)
* fix router supported for handler of package ghttp; fix json tag name issue when it contains for package goai
* add proxy example for http server
* rename function names for package gtcp/gudp; add proxy example for gtcp.Server
* move TX from struct to interface for package gdb (#2247)
* move TX from struct to interface for package gdb
* i updates
* up
* up
* fix comment
Co-authored-by: houseme <housemecn@gmail.com>
* move `go-redis` implements `Adapter` from package `gredis` to `contrib/nosql/redis`; add redis string operation functions for package `gredis` (#2240)
* unify configuration pattern of for package gdb
* version updates
* improve implements `internal/rwmutex` and `internal/mutex`; add `TablesFields` cache implements in `gdb.Core` instead of `contrib/drivers`; add `ClearTableFields` and `ClearCache` functions for `gdb.Core` (#2128)
* add ClearTableFiels/ClearCache for Core of package gdb
* improve TableFields for contrib/drivers
* fix UT case for contrib/drivers/clickhouse
* remove unecessary attribute state for internal/rwmutex and internal/mutex
* add ClearTableFieldsAll/ClearCacheAll for gdb.Core
* improve clickhouse driver
* improve clickhouse driver
* fix ut
* feat: improve import
Co-authored-by: daguang <daguang830@gmail.com>
Co-authored-by: houseme <housemecn@gmail.com>
* refract builtin rules management mechanism, add `eq/not-eq/gt/gte/lt/lte/before/before-equal/after/after-equal/array/not-regex` rules for for package `gvalid` (#2133)
* refract builtin rules management for package gvalid
* refract builtin rules management for package gvalid
* refract builtin rules management for package gvalid
* add valiation rules and implements for package gvalid
* UT cases update for package gvalid
* improve error message of fields validation for package gvalid
* up
* add more validation rules for package gvalid
* add validation rule foreach for package gvalid (#2136)
* add ToSQL/CatchSQL funcions for package gdb (#2137)
* add ToSQL/CatchSQL funcions for package gdb
* Update gdb_core_underlying.go
* fix ci
Co-authored-by: houseme <housemecn@gmail.com>
* add redis interface for package gredis
* up
* remove `FilteredLink` function for DB and all driver implements and improve details for package gdb (#2142)
* fix: pgsql DoExec Transaction checks (#2101)
Co-authored-by: John Guo <john@johng.cn>
* improve package gdb
* up
* up
* up
* up
* up
* add DriverWrapper and DriverWarapperDB for package gdb
* add DriverWrapper and DriverWarapperDB for package gdb
* up
Co-authored-by: HaiLaz <739476267@qq.com>
* add new database driver `dm`
* add drivers dm
* upd go version
* add gf ci yaml
Co-authored-by: Xu <zhenghao.xu>
* move go-redis implements from package gredis to contrib/nosql/redis; add redis string operation functions for package gredis
* improve `contrib/drivers/dm` (#2144)
* improve contrib/drivers/dm
* format TODO list info
* 1) add config.Name is required
2) The upper layer no longer needs to specify the schema
3) Adjust unit tests
Co-authored-by: Xu <zhenghao.xu>
Co-authored-by: houseme <housemecn@gmail.com>
* move redis adapter related ut case from package gcache/gsession to package contrib/nosql/redis
* up
* up
* up
* up
* up
* improve comment
* add implements of `gcfg.Adapter` using kubernetes configmap (#2145)
* remove Logger from kubecm.Client
* README updates for package kubecm
* error message update for package gredis
* comment update for package gdb
* Feature/v2.2.0 gredis (#2155)
* improve package gredis (#2162)
* improve package gredis
* Update gredis_redis_group_list.go
* fix
* up
Co-authored-by: houseme <housemecn@gmail.com>
* up
* up
* up
* up
* up
* up
* add func Test_GroupScript_Eval
* ut cases for group string
* UT cases update for group script
* mv redis operation implements to contrib/nosql/redis from package gredis
* test: add redis group list unit test (#2248)
* test: add redis group list unit test
* improve comment
* test: fix redis group list unit test
Co-authored-by: houseme <housemecn@gmail.com>
* up
* add func Test_GroupGeneric_Copy, Test_GroupGeneric_Exists,Test_GroupGeneric_Type,Test_GroupGeneric_Unlink,Test_GroupGeneric_Rename,Test_GroupGeneric_Move,Test_GroupGeneric_Del
* add Redis GroupGeneric UnitTest (#2253)
add func Test_GroupGeneric_RandomKey,Test_GroupGeneric_DBSize,Test_GroupGeneric_Keys,Test_GroupGeneric_FlushDB,Test_GroupGeneric_FlushAll,Test_GroupGeneric_Expire,Test_GroupGeneric_ExpireAt
* hash test case completed (#2260)
Co-authored-by: junler <sunjun@bookan.com>
* add Redis GroupGeneric Unit Test part2 (#2258)
* up
* ci updates
* ci updates
* up
* Feature/contrib redis fsprouts (#2274)
* Feature/contrib redis starck (#2275)
* up
* up
* fix `/*` router supported for handler of package ghttp; fix json tag name issue when it contains `,` for package goai; add proxy example for http server (#2294)
* fix router supported for handler of package ghttp; fix json tag name issue when it contains for package goai
* add proxy example for http server
* fix: update szenius/set-timezone@v1.1 (#2293)
* add Tag* functions to retreive most commonly used tag value from struct field for package gstructs; use description tag as default value if brief is empty for gcmd.Argument (#2299)
* fix cache issue in Count/Value functions for gdb.Model (#2300)
* add Tag* functions to retreive most commonly used tag value from struct field for package gstructs; use description tag as default value if brief is empty for gcmd.Argument
* fix cache issue in Count/Value functions for gdb.Model
* add more ut case for package gdb
* version updates
* add minus of `start` parameter support for `gstr.Substr`, like the `substr` function in `PHP` (#2297)
* Make the substr like the substr in PHP
Make the substr like the substr in PHP
* Update gstr_z_unit_test.go
* Update gstr_z_unit_test.go
* Make the SubStrRune like the mb_substr in PHP
Make the SubStrRune like the mb_substr in PHP
* Update gstr_z_unit_test.go
* Update gstr_z_unit_test.go
* Update gins_z_unit_view_test.go
* Update gview_z_unit_test.go
* add ut cases for package gcode (#2307)
* add ut cases for package gerror (#2304)
* add ut cases for package gerror
* add ut cases for package gerror
* add ut cases for package gtime (#2303)
* add ut cases for package gtime
* add ut cases for package gtime
* add ut cases for package gtime
* add ut cases for package glog (#2302)
* add ut cases for package glog
* add ut cases for package glog
* add ut cases for package glog
* add ut cases for package glog
* add ut cases for package glog
* add ut cases for package glog
* change result data type of function Count from int to int64 for package gdb (#2298)
* feat: modify model count value int64
* fix
* fix:modify int64
* fix
* feat: cmd gf prebuild suport oracle (#2312)
* add ut cases for package g (#2315)
* add ut cases for package gdebug (#2313)
* add ut cases for package gdebug
* add ut cases for package gdebug
* add ut cases for package gdebug
Co-authored-by: houseme <housemecn@gmail.com>
* add zookeeper registry support (#2284)
* add ut cases for package glog part2 (#2317)
* fix invalid UpdatedAt usage in soft deleting feature for package gdb (#2323)
* fix issue in failed installing when there's shortcut between file paths for command install (#2326)
* fix issue in failed installing when has shortcut between file paths for command install
* version updates
* template for command gf updates
* improve lru clearing for package gcache (#2327)
* add ut cases for package ghttp_middleware and ghttp_request (#2344)
* add ut cases for package ghttp_middleware
* add ut cases for package ghttp_request
* add ut cases for package ghttp_request
* add ut cases for package ghttp_response (#2352)
* add ut cases for package ghttp_response
* add ut cases for package ghttp_response
* add ut cases for package ghttp_response
* add ut cases for package ghttp_request (#2351)
* add ut cases for package ghttp_middleware
* add ut cases for package ghttp_request
* add ut cases for package ghttp_request
* add ut cases for package ghttp_request
* add ut cases for package ghttp_request - form
* add ut cases for package ghttp_request - query
* add ut cases for package ghttp_request - request
* add ut cases for package ghttp_request - router
* add ut cases for package gcache (#2341)
* gTcp Example Function:
1.NewConn 2.NewConnTLS 3.NewConnKeyCrt
* gTcp Example Function:
1.Send
* add example function ExampleConn_Recv and ExampleConn_RecvWithTimeout
* add example function
1. ExampleConn_SendWithTimeout
2. ExampleConn_RecvLine
3. ExampleConn_RecvTill
* add example function
1. ExampleConn_SendRecv
2. ExampleConn_SendRecvWithTimeout
3. ExampleConn_SetDeadline
4. ExampleConn_SetReceiveBufferWait
* add gtcp test function
1. Test_Package_Option_HeadSize4
2. Test_Package_Option_Error
* add gtcp example function
1. ExampleGetFreePorts
2. ExampleSend
3. ExampleSendRecv
4. ExampleSendWithTimeout
5. ExampleSendRecvWithTimeout
6. ExampleMustGetFreePort
* add gtcp example function
1. ExampleSendPkg
2. ExampleSendRecvPkg
3. ExampleSendPkgWithTimeout
4. ExampleSendRecvPkgWithTimeout
* add gtcp test function
1. Test_Pool_Send
2. Test_Pool_Recv
3. Test_Pool_RecvLine
4. Test_Pool_RecvTill
5. Test_Pool_RecvWithTimeout
6. Test_Pool_SendWithTimeout
7. Test_Pool_SendRecvWithTimeout
* fix
* add gtcp example function
1. ExampleGetServer
2. ExampleSetAddress
3. ExampleSetHandler
4. ExampleRun_NilHandle
* exec CI
* exec CI
* exec CI
* modify test server address
* modify and exec CI
* modify and exec CI
* modify and exec CI
* modify and exec CI
* modify and exec CI
* modify and exec CI
* add example funcion ExampleConn_Recv_Once and fix
* fix
* add some error case in example function
* add some error case in example function
* 1.add example function ExampleNewServerKeyCrt
2.add function SendRecvPkgWithTimeout unit test
* add function Test_Server_NewServerKeyCrt unit test
* revert
* add function Test_Package_Timeout, Test_Package_Option_HeadSize3, Test_Conn_RecvPkgError unit test
* fix
* add example function
1.ExampleClient_Clone
2.ExampleLoadKeyCrt
* add example function
1.ExampleNewNetConnKeyCrt
* fix
* add example function
1.ExampleClient_DeleteBytes
2.ExampleClient_HeadBytes
3.ExampleClient_PatchBytes
4.ExampleClient_ConnectBytes
5.ExampleClient_OptionsBytes
6.ExampleClient_TraceBytes
7.ExampleClient_PutBytes
* add example function
1.ExampleClient_Prefix
2.ExampleClient_Retry
3.ExampleClient_RedirectLimit
* add example function
1.ExampleClient_SetBrowserMode
2.ExampleClient_SetHeader
3.ExampleClient_SetRedirectLimit
* add example function
1.ExampleClient_SetTLSKeyCrt
2.ExampleClient_SetTLSConfig
modify example funcion
1.ExampleClient_SetProxy
2.ExampleClient_Proxy
* add example function
1.ExampleClient_PutContent
2.ExampleClient_DeleteContent
3.ExampleClient_HeadContent
4.ExampleClient_PatchContent
5.ExampleClient_ConnectContent
6.ExampleClient_OptionsContent
7.ExampleClient_TraceContent
8.ExampleClient_RequestContent
* add example function
1.ExampleClient_RawRequest
* add unit function
1.TestGetFreePorts
2.TestNewConn
3.TestNewConnTLS
4.TestNewConnKeyCrt
5.TestConn_SendWithTimeout
* add unit function
1.TestConn_Send
2.TestConn_SendRecv
3.TestConn_SendRecvWithTimeout
* modify
* modify
* add example function
1.TestConn_SetReceiveBufferWait
2.TestNewNetConnKeyCrt
3.TestSend
* add example function
1.TestSendRecv
2.TestSendWithTimeout
* add unit function
1.TestMustGetFreePort
2.TestSendRecvWithTimeout
3.TestSendPkg
* add client recevied server's response content assert
* modify
* modify
* add example function
1.TestSendRecvPkg
2.TestSendPkgWithTimeout
3.TestSendRecvPkgWithTimeout
* add GetAddress() function
add unit funciton
1.TestNewServer
2.TestGetServer
3.TestServer_SetAddress
4.TestServer_SetHandler
5.TestServer_Run
* modify
* modify
* add unit funciton
1.TestLoadKeyCrt
* modify
* delete function fromHex
* add gclient dump unit test
* add example function
1.ExampleClient_Put
2.ExampleClient_Delete
3.ExampleClient_Head
4.ExampleClient_Patch
5.ExampleClient_Connect
6.ExampleClient_Options
7.ExampleClient_Trace
* add example function
1.TestClient_DoRequest
* add example function
1.ExampleClient_PutVar
2.ExampleClient_DeleteVar
3.ExampleClient_HeadVar
4.ExampleClient_PatchVar
5.ExampleClient_ConnectVar
6.ExampleClient_OptionsVar
7.ExampleClient_TraceVar
* modify
* modify
* add CustomProvider function
* modify
* add unit funciton
1.Test_NewConn
2.Test_GetFreePorts
* add unit funciton
1.Test_Server
* garray_normal_any code converage
* garray_normal_int code converage
* garray_normal_str code converage
* garray_sorted_any code converage
* garray_sorted_int code converage
* garray_sorted_str code converage
* glist code converage
* gmap, gmap_hash_any_any_map code converage
* gmap_hash_int_any_map code converage
* gmap_hash_int_any_map code converage
* gmap_hash_int_int_map code converage
* gmap_hash_int_str_map code converage
* gmap_hash_str_any_map code converage
* gmap_hash_str_int_map code converage
* gmap_hash_str_str_map code converage
* gmap_list_map code converage
* gmap_list_map code converage
* revert gf.yml
* add gtest unit test function
* add ut cases for package gcache
* add ut cases for package gcache
* add ut cases for package gcache
* add ut cases for package gcache
* add ut cases for package gcache
* modify
Co-authored-by: John Guo <john@johng.cn>
* improve ut case for package internal/rwmutex (#2364)
* fix issue when only one file was uploaded in batch receiver attribute (#2365)
* fix fixed An error occurred when only one file was uploaded in batches and add unit testing(#2092)
* fix issue uploading files for ghttp.Server
Co-authored-by: yxh <yxh1103@qq.com>
* fix issue #2334 when accessing static files with cache time (#2366)
* Solve the problem of error when accessing static files with cache time.
Error message:
2022-11-29 19:40:11.090 [ERRO] http: superfluous response.WriteHeader call from github.com/gogf/gf/v2/net/ghttp.(*ResponseWriter).Flush (ghttp_response_writer.go:58)
Stack:
Verification method:
curl 'http://127.0.0.1:8000/' -H 'If-Modified-Since: Thu, 08 Dec 2022 03:13:55 GMT' --compressed
* Solve the problem of error when accessing static files with cache time.
Error message:
2022-11-29 19:40:11.090 [ERRO] http: superfluous response.WriteHeader call from github.com/gogf/gf/v2/net/ghttp.(*ResponseWriter).Flush (ghttp_response_writer.go:58)
Stack:
Verification method:
curl 'http://127.0.0.1:8000/' -H 'If-Modified-Since: Thu, 08 Dec 2022 03:13:55 GMT' --compressed
* Solve the problem of error when accessing static files with cache time.
Error message:
2022-11-29 19:40:11.090 [ERRO] http: superfluous response.WriteHeader call from github.com/gogf/gf/v2/net/ghttp.(*ResponseWriter).Flush (ghttp_response_writer.go:58)
Stack:
Verification method:
curl 'http://127.0.0.1:8000/' -H 'If-Modified-Since: Thu, 08 Dec 2022 03:13:55 GMT' --compressed
* fix issue #2334 when accessing static files with cache time
* up
Co-authored-by: 曾洪亮 <hongliang.zeng@i-soft.com.cn>
Co-authored-by: houseme <housemecn@gmail.com>
* fix issue in cycle dumping for g.Dump (#2367)
* fix issue in cycle dumping for g.Dump
* up
* up
* up
Co-authored-by: houseme <housemecn@gmail.com>
* 由于 clickhouse 的 position的初始值为 1,导致gdb_core_utility.HasField 中对 fieldsArray 初始化出错 (#2346)
* 由于 clickhouse 的 position的初始值为 1,导致gdb_core_utility.HasField 中对 fieldsArray 初始化出错
* 修复单元测试
* 修复单元测试
* 补充单元测试
* 增加CK防御性代码
Co-authored-by: longl <longlei@dealmap.cloud>
Co-authored-by: houseme <housemecn@gmail.com>
* fix: ghttp server static path config (#2335)
Co-authored-by: daguang <daguang830@gmail.com>
Co-authored-by: houseme <housemecn@gmail.com>
Co-authored-by: ftl <1139556759@qq.com>
Co-authored-by: HaiLaz <739476267@qq.com>
Co-authored-by: zhonghuaxunGM <50815786+zhonghuaxunGM@users.noreply.github.com>
Co-authored-by: huangqian <huangqian1985@qq.com>
Co-authored-by: junler <827640651@qq.com>
Co-authored-by: junler <sunjun@bookan.com>
Co-authored-by: Starccck <28645972+starccck@users.noreply.github.com>
Co-authored-by: Jinhongyu <30454170+cnjinhy@users.noreply.github.com>
Co-authored-by: YuanXin Hu <huyuanxin1999@outlook.com>
Co-authored-by: yxh <yxh1103@qq.com>
Co-authored-by: 曾洪亮 <hongliang.zeng@i-soft.com.cn>
Co-authored-by: long <48313408+qq375251855@users.noreply.github.com>
Co-authored-by: longl <longlei@dealmap.cloud>
Co-authored-by: houseme <housemecn@gmail.com>
Co-authored-by: daguang <daguang830@gmail.com>
Co-authored-by: ftl <1139556759@qq.com>
Co-authored-by: HaiLaz <739476267@qq.com>
Co-authored-by: zhonghuaxunGM <50815786+zhonghuaxunGM@users.noreply.github.com>
Co-authored-by: huangqian <huangqian1985@qq.com>
Co-authored-by: junler <827640651@qq.com>
Co-authored-by: junler <sunjun@bookan.com>
Co-authored-by: Starccck <28645972+starccck@users.noreply.github.com>
Co-authored-by: Jinhongyu <30454170+cnjinhy@users.noreply.github.com>
Co-authored-by: YuanXin Hu <huyuanxin1999@outlook.com>
Co-authored-by: yxh <yxh1103@qq.com>
Co-authored-by: 曾洪亮 <hongliang.zeng@i-soft.com.cn>
Co-authored-by: long <48313408+qq375251855@users.noreply.github.com>
Co-authored-by: longl <longlei@dealmap.cloud>
2023-01-09 14:43:10 +08:00
err = db . Transaction ( context . TODO ( ) , func ( ctx context . Context , tx gdb . TX ) error {
2022-06-06 19:57:53 +08:00
one , err := tx . Model ( table ) . Cache ( gdb . CacheOption {
Duration : time . Second ,
Name : "test3" ,
Force : false ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 3 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 3 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 4 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 4 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , err := r . RowsAffected ( )
t . AssertNil ( err )
t . Assert ( n , 1 )
feature/v2.3.0 (#2296)
* up
* rename function names for package gtcp/gudp; add proxy example for gtcp.Server (#2295)
* fix router supported for handler of package ghttp; fix json tag name issue when it contains for package goai
* add proxy example for http server
* rename function names for package gtcp/gudp; add proxy example for gtcp.Server
* move TX from struct to interface for package gdb (#2247)
* move TX from struct to interface for package gdb
* i updates
* up
* up
* fix comment
Co-authored-by: houseme <housemecn@gmail.com>
* move `go-redis` implements `Adapter` from package `gredis` to `contrib/nosql/redis`; add redis string operation functions for package `gredis` (#2240)
* unify configuration pattern of for package gdb
* version updates
* improve implements `internal/rwmutex` and `internal/mutex`; add `TablesFields` cache implements in `gdb.Core` instead of `contrib/drivers`; add `ClearTableFields` and `ClearCache` functions for `gdb.Core` (#2128)
* add ClearTableFiels/ClearCache for Core of package gdb
* improve TableFields for contrib/drivers
* fix UT case for contrib/drivers/clickhouse
* remove unecessary attribute state for internal/rwmutex and internal/mutex
* add ClearTableFieldsAll/ClearCacheAll for gdb.Core
* improve clickhouse driver
* improve clickhouse driver
* fix ut
* feat: improve import
Co-authored-by: daguang <daguang830@gmail.com>
Co-authored-by: houseme <housemecn@gmail.com>
* refract builtin rules management mechanism, add `eq/not-eq/gt/gte/lt/lte/before/before-equal/after/after-equal/array/not-regex` rules for for package `gvalid` (#2133)
* refract builtin rules management for package gvalid
* refract builtin rules management for package gvalid
* refract builtin rules management for package gvalid
* add valiation rules and implements for package gvalid
* UT cases update for package gvalid
* improve error message of fields validation for package gvalid
* up
* add more validation rules for package gvalid
* add validation rule foreach for package gvalid (#2136)
* add ToSQL/CatchSQL funcions for package gdb (#2137)
* add ToSQL/CatchSQL funcions for package gdb
* Update gdb_core_underlying.go
* fix ci
Co-authored-by: houseme <housemecn@gmail.com>
* add redis interface for package gredis
* up
* remove `FilteredLink` function for DB and all driver implements and improve details for package gdb (#2142)
* fix: pgsql DoExec Transaction checks (#2101)
Co-authored-by: John Guo <john@johng.cn>
* improve package gdb
* up
* up
* up
* up
* up
* add DriverWrapper and DriverWarapperDB for package gdb
* add DriverWrapper and DriverWarapperDB for package gdb
* up
Co-authored-by: HaiLaz <739476267@qq.com>
* add new database driver `dm`
* add drivers dm
* upd go version
* add gf ci yaml
Co-authored-by: Xu <zhenghao.xu>
* move go-redis implements from package gredis to contrib/nosql/redis; add redis string operation functions for package gredis
* improve `contrib/drivers/dm` (#2144)
* improve contrib/drivers/dm
* format TODO list info
* 1) add config.Name is required
2) The upper layer no longer needs to specify the schema
3) Adjust unit tests
Co-authored-by: Xu <zhenghao.xu>
Co-authored-by: houseme <housemecn@gmail.com>
* move redis adapter related ut case from package gcache/gsession to package contrib/nosql/redis
* up
* up
* up
* up
* up
* improve comment
* add implements of `gcfg.Adapter` using kubernetes configmap (#2145)
* remove Logger from kubecm.Client
* README updates for package kubecm
* error message update for package gredis
* comment update for package gdb
* Feature/v2.2.0 gredis (#2155)
* improve package gredis (#2162)
* improve package gredis
* Update gredis_redis_group_list.go
* fix
* up
Co-authored-by: houseme <housemecn@gmail.com>
* up
* up
* up
* up
* up
* up
* add func Test_GroupScript_Eval
* ut cases for group string
* UT cases update for group script
* mv redis operation implements to contrib/nosql/redis from package gredis
* test: add redis group list unit test (#2248)
* test: add redis group list unit test
* improve comment
* test: fix redis group list unit test
Co-authored-by: houseme <housemecn@gmail.com>
* up
* add func Test_GroupGeneric_Copy, Test_GroupGeneric_Exists,Test_GroupGeneric_Type,Test_GroupGeneric_Unlink,Test_GroupGeneric_Rename,Test_GroupGeneric_Move,Test_GroupGeneric_Del
* add Redis GroupGeneric UnitTest (#2253)
add func Test_GroupGeneric_RandomKey,Test_GroupGeneric_DBSize,Test_GroupGeneric_Keys,Test_GroupGeneric_FlushDB,Test_GroupGeneric_FlushAll,Test_GroupGeneric_Expire,Test_GroupGeneric_ExpireAt
* hash test case completed (#2260)
Co-authored-by: junler <sunjun@bookan.com>
* add Redis GroupGeneric Unit Test part2 (#2258)
* up
* ci updates
* ci updates
* up
* Feature/contrib redis fsprouts (#2274)
* Feature/contrib redis starck (#2275)
* up
* up
* fix `/*` router supported for handler of package ghttp; fix json tag name issue when it contains `,` for package goai; add proxy example for http server (#2294)
* fix router supported for handler of package ghttp; fix json tag name issue when it contains for package goai
* add proxy example for http server
* fix: update szenius/set-timezone@v1.1 (#2293)
* add Tag* functions to retreive most commonly used tag value from struct field for package gstructs; use description tag as default value if brief is empty for gcmd.Argument (#2299)
* fix cache issue in Count/Value functions for gdb.Model (#2300)
* add Tag* functions to retreive most commonly used tag value from struct field for package gstructs; use description tag as default value if brief is empty for gcmd.Argument
* fix cache issue in Count/Value functions for gdb.Model
* add more ut case for package gdb
* version updates
* add minus of `start` parameter support for `gstr.Substr`, like the `substr` function in `PHP` (#2297)
* Make the substr like the substr in PHP
Make the substr like the substr in PHP
* Update gstr_z_unit_test.go
* Update gstr_z_unit_test.go
* Make the SubStrRune like the mb_substr in PHP
Make the SubStrRune like the mb_substr in PHP
* Update gstr_z_unit_test.go
* Update gstr_z_unit_test.go
* Update gins_z_unit_view_test.go
* Update gview_z_unit_test.go
* add ut cases for package gcode (#2307)
* add ut cases for package gerror (#2304)
* add ut cases for package gerror
* add ut cases for package gerror
* add ut cases for package gtime (#2303)
* add ut cases for package gtime
* add ut cases for package gtime
* add ut cases for package gtime
* add ut cases for package glog (#2302)
* add ut cases for package glog
* add ut cases for package glog
* add ut cases for package glog
* add ut cases for package glog
* add ut cases for package glog
* add ut cases for package glog
* change result data type of function Count from int to int64 for package gdb (#2298)
* feat: modify model count value int64
* fix
* fix:modify int64
* fix
* feat: cmd gf prebuild suport oracle (#2312)
* add ut cases for package g (#2315)
* add ut cases for package gdebug (#2313)
* add ut cases for package gdebug
* add ut cases for package gdebug
* add ut cases for package gdebug
Co-authored-by: houseme <housemecn@gmail.com>
* add zookeeper registry support (#2284)
* add ut cases for package glog part2 (#2317)
* fix invalid UpdatedAt usage in soft deleting feature for package gdb (#2323)
* fix issue in failed installing when there's shortcut between file paths for command install (#2326)
* fix issue in failed installing when has shortcut between file paths for command install
* version updates
* template for command gf updates
* improve lru clearing for package gcache (#2327)
* add ut cases for package ghttp_middleware and ghttp_request (#2344)
* add ut cases for package ghttp_middleware
* add ut cases for package ghttp_request
* add ut cases for package ghttp_request
* add ut cases for package ghttp_response (#2352)
* add ut cases for package ghttp_response
* add ut cases for package ghttp_response
* add ut cases for package ghttp_response
* add ut cases for package ghttp_request (#2351)
* add ut cases for package ghttp_middleware
* add ut cases for package ghttp_request
* add ut cases for package ghttp_request
* add ut cases for package ghttp_request
* add ut cases for package ghttp_request - form
* add ut cases for package ghttp_request - query
* add ut cases for package ghttp_request - request
* add ut cases for package ghttp_request - router
* add ut cases for package gcache (#2341)
* gTcp Example Function:
1.NewConn 2.NewConnTLS 3.NewConnKeyCrt
* gTcp Example Function:
1.Send
* add example function ExampleConn_Recv and ExampleConn_RecvWithTimeout
* add example function
1. ExampleConn_SendWithTimeout
2. ExampleConn_RecvLine
3. ExampleConn_RecvTill
* add example function
1. ExampleConn_SendRecv
2. ExampleConn_SendRecvWithTimeout
3. ExampleConn_SetDeadline
4. ExampleConn_SetReceiveBufferWait
* add gtcp test function
1. Test_Package_Option_HeadSize4
2. Test_Package_Option_Error
* add gtcp example function
1. ExampleGetFreePorts
2. ExampleSend
3. ExampleSendRecv
4. ExampleSendWithTimeout
5. ExampleSendRecvWithTimeout
6. ExampleMustGetFreePort
* add gtcp example function
1. ExampleSendPkg
2. ExampleSendRecvPkg
3. ExampleSendPkgWithTimeout
4. ExampleSendRecvPkgWithTimeout
* add gtcp test function
1. Test_Pool_Send
2. Test_Pool_Recv
3. Test_Pool_RecvLine
4. Test_Pool_RecvTill
5. Test_Pool_RecvWithTimeout
6. Test_Pool_SendWithTimeout
7. Test_Pool_SendRecvWithTimeout
* fix
* add gtcp example function
1. ExampleGetServer
2. ExampleSetAddress
3. ExampleSetHandler
4. ExampleRun_NilHandle
* exec CI
* exec CI
* exec CI
* modify test server address
* modify and exec CI
* modify and exec CI
* modify and exec CI
* modify and exec CI
* modify and exec CI
* modify and exec CI
* add example funcion ExampleConn_Recv_Once and fix
* fix
* add some error case in example function
* add some error case in example function
* 1.add example function ExampleNewServerKeyCrt
2.add function SendRecvPkgWithTimeout unit test
* add function Test_Server_NewServerKeyCrt unit test
* revert
* add function Test_Package_Timeout, Test_Package_Option_HeadSize3, Test_Conn_RecvPkgError unit test
* fix
* add example function
1.ExampleClient_Clone
2.ExampleLoadKeyCrt
* add example function
1.ExampleNewNetConnKeyCrt
* fix
* add example function
1.ExampleClient_DeleteBytes
2.ExampleClient_HeadBytes
3.ExampleClient_PatchBytes
4.ExampleClient_ConnectBytes
5.ExampleClient_OptionsBytes
6.ExampleClient_TraceBytes
7.ExampleClient_PutBytes
* add example function
1.ExampleClient_Prefix
2.ExampleClient_Retry
3.ExampleClient_RedirectLimit
* add example function
1.ExampleClient_SetBrowserMode
2.ExampleClient_SetHeader
3.ExampleClient_SetRedirectLimit
* add example function
1.ExampleClient_SetTLSKeyCrt
2.ExampleClient_SetTLSConfig
modify example funcion
1.ExampleClient_SetProxy
2.ExampleClient_Proxy
* add example function
1.ExampleClient_PutContent
2.ExampleClient_DeleteContent
3.ExampleClient_HeadContent
4.ExampleClient_PatchContent
5.ExampleClient_ConnectContent
6.ExampleClient_OptionsContent
7.ExampleClient_TraceContent
8.ExampleClient_RequestContent
* add example function
1.ExampleClient_RawRequest
* add unit function
1.TestGetFreePorts
2.TestNewConn
3.TestNewConnTLS
4.TestNewConnKeyCrt
5.TestConn_SendWithTimeout
* add unit function
1.TestConn_Send
2.TestConn_SendRecv
3.TestConn_SendRecvWithTimeout
* modify
* modify
* add example function
1.TestConn_SetReceiveBufferWait
2.TestNewNetConnKeyCrt
3.TestSend
* add example function
1.TestSendRecv
2.TestSendWithTimeout
* add unit function
1.TestMustGetFreePort
2.TestSendRecvWithTimeout
3.TestSendPkg
* add client recevied server's response content assert
* modify
* modify
* add example function
1.TestSendRecvPkg
2.TestSendPkgWithTimeout
3.TestSendRecvPkgWithTimeout
* add GetAddress() function
add unit funciton
1.TestNewServer
2.TestGetServer
3.TestServer_SetAddress
4.TestServer_SetHandler
5.TestServer_Run
* modify
* modify
* add unit funciton
1.TestLoadKeyCrt
* modify
* delete function fromHex
* add gclient dump unit test
* add example function
1.ExampleClient_Put
2.ExampleClient_Delete
3.ExampleClient_Head
4.ExampleClient_Patch
5.ExampleClient_Connect
6.ExampleClient_Options
7.ExampleClient_Trace
* add example function
1.TestClient_DoRequest
* add example function
1.ExampleClient_PutVar
2.ExampleClient_DeleteVar
3.ExampleClient_HeadVar
4.ExampleClient_PatchVar
5.ExampleClient_ConnectVar
6.ExampleClient_OptionsVar
7.ExampleClient_TraceVar
* modify
* modify
* add CustomProvider function
* modify
* add unit funciton
1.Test_NewConn
2.Test_GetFreePorts
* add unit funciton
1.Test_Server
* garray_normal_any code converage
* garray_normal_int code converage
* garray_normal_str code converage
* garray_sorted_any code converage
* garray_sorted_int code converage
* garray_sorted_str code converage
* glist code converage
* gmap, gmap_hash_any_any_map code converage
* gmap_hash_int_any_map code converage
* gmap_hash_int_any_map code converage
* gmap_hash_int_int_map code converage
* gmap_hash_int_str_map code converage
* gmap_hash_str_any_map code converage
* gmap_hash_str_int_map code converage
* gmap_hash_str_str_map code converage
* gmap_list_map code converage
* gmap_list_map code converage
* revert gf.yml
* add gtest unit test function
* add ut cases for package gcache
* add ut cases for package gcache
* add ut cases for package gcache
* add ut cases for package gcache
* add ut cases for package gcache
* modify
Co-authored-by: John Guo <john@johng.cn>
* improve ut case for package internal/rwmutex (#2364)
* fix issue when only one file was uploaded in batch receiver attribute (#2365)
* fix fixed An error occurred when only one file was uploaded in batches and add unit testing(#2092)
* fix issue uploading files for ghttp.Server
Co-authored-by: yxh <yxh1103@qq.com>
* fix issue #2334 when accessing static files with cache time (#2366)
* Solve the problem of error when accessing static files with cache time.
Error message:
2022-11-29 19:40:11.090 [ERRO] http: superfluous response.WriteHeader call from github.com/gogf/gf/v2/net/ghttp.(*ResponseWriter).Flush (ghttp_response_writer.go:58)
Stack:
Verification method:
curl 'http://127.0.0.1:8000/' -H 'If-Modified-Since: Thu, 08 Dec 2022 03:13:55 GMT' --compressed
* Solve the problem of error when accessing static files with cache time.
Error message:
2022-11-29 19:40:11.090 [ERRO] http: superfluous response.WriteHeader call from github.com/gogf/gf/v2/net/ghttp.(*ResponseWriter).Flush (ghttp_response_writer.go:58)
Stack:
Verification method:
curl 'http://127.0.0.1:8000/' -H 'If-Modified-Since: Thu, 08 Dec 2022 03:13:55 GMT' --compressed
* Solve the problem of error when accessing static files with cache time.
Error message:
2022-11-29 19:40:11.090 [ERRO] http: superfluous response.WriteHeader call from github.com/gogf/gf/v2/net/ghttp.(*ResponseWriter).Flush (ghttp_response_writer.go:58)
Stack:
Verification method:
curl 'http://127.0.0.1:8000/' -H 'If-Modified-Since: Thu, 08 Dec 2022 03:13:55 GMT' --compressed
* fix issue #2334 when accessing static files with cache time
* up
Co-authored-by: 曾洪亮 <hongliang.zeng@i-soft.com.cn>
Co-authored-by: houseme <housemecn@gmail.com>
* fix issue in cycle dumping for g.Dump (#2367)
* fix issue in cycle dumping for g.Dump
* up
* up
* up
Co-authored-by: houseme <housemecn@gmail.com>
* 由于 clickhouse 的 position的初始值为 1,导致gdb_core_utility.HasField 中对 fieldsArray 初始化出错 (#2346)
* 由于 clickhouse 的 position的初始值为 1,导致gdb_core_utility.HasField 中对 fieldsArray 初始化出错
* 修复单元测试
* 修复单元测试
* 补充单元测试
* 增加CK防御性代码
Co-authored-by: longl <longlei@dealmap.cloud>
Co-authored-by: houseme <housemecn@gmail.com>
* fix: ghttp server static path config (#2335)
Co-authored-by: daguang <daguang830@gmail.com>
Co-authored-by: houseme <housemecn@gmail.com>
Co-authored-by: ftl <1139556759@qq.com>
Co-authored-by: HaiLaz <739476267@qq.com>
Co-authored-by: zhonghuaxunGM <50815786+zhonghuaxunGM@users.noreply.github.com>
Co-authored-by: huangqian <huangqian1985@qq.com>
Co-authored-by: junler <827640651@qq.com>
Co-authored-by: junler <sunjun@bookan.com>
Co-authored-by: Starccck <28645972+starccck@users.noreply.github.com>
Co-authored-by: Jinhongyu <30454170+cnjinhy@users.noreply.github.com>
Co-authored-by: YuanXin Hu <huyuanxin1999@outlook.com>
Co-authored-by: yxh <yxh1103@qq.com>
Co-authored-by: 曾洪亮 <hongliang.zeng@i-soft.com.cn>
Co-authored-by: long <48313408+qq375251855@users.noreply.github.com>
Co-authored-by: longl <longlei@dealmap.cloud>
Co-authored-by: houseme <housemecn@gmail.com>
Co-authored-by: daguang <daguang830@gmail.com>
Co-authored-by: ftl <1139556759@qq.com>
Co-authored-by: HaiLaz <739476267@qq.com>
Co-authored-by: zhonghuaxunGM <50815786+zhonghuaxunGM@users.noreply.github.com>
Co-authored-by: huangqian <huangqian1985@qq.com>
Co-authored-by: junler <827640651@qq.com>
Co-authored-by: junler <sunjun@bookan.com>
Co-authored-by: Starccck <28645972+starccck@users.noreply.github.com>
Co-authored-by: Jinhongyu <30454170+cnjinhy@users.noreply.github.com>
Co-authored-by: YuanXin Hu <huyuanxin1999@outlook.com>
Co-authored-by: yxh <yxh1103@qq.com>
Co-authored-by: 曾洪亮 <hongliang.zeng@i-soft.com.cn>
Co-authored-by: long <48313408+qq375251855@users.noreply.github.com>
Co-authored-by: longl <longlei@dealmap.cloud>
2023-01-09 14:43:10 +08:00
err = db . Transaction ( context . TODO ( ) , func ( ctx context . Context , tx gdb . TX ) error {
2022-06-06 19:57:53 +08:00
// Cache feature disabled.
one , err := tx . Model ( table ) . Cache ( gdb . CacheOption {
Duration : time . Second ,
Name : "test4" ,
Force : false ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 4 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 4 ) . Update ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . WherePri ( 4 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( one [ "passport" ] , "user_4000" )
} )
}
func Test_Model_Having ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
all , err := db . Model ( table ) . Where ( "id > 1" ) . Group ( "id" ) . Having ( "id > 8" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( all ) , 2 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
all , err := db . Model ( table ) . Where ( "id > 1" ) . Group ( "id" ) . Having ( "id > ?" , 8 ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( all ) , 2 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
all , err := db . Model ( table ) . Where ( "id > ?" , 1 ) . Group ( "id" ) . Having ( "id > ?" , 8 ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( all ) , 2 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
all , err := db . Model ( table ) . Where ( "id > ?" , 1 ) . Group ( "id" ) . Having ( "id" , 8 ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( all ) , 1 )
} )
}
func Test_Model_Distinct ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
all , err := db . Model ( table , "t" ) . Fields ( "distinct t.id" ) . Where ( "id > 1" ) . Group ( "id" ) . Having ( "id > 8" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( all ) , 2 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . Where ( "id > 1" ) . Distinct ( ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( 9 ) )
2022-06-06 19:57:53 +08:00
} )
}
func Test_Model_Min_Max ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
value , err := db . Model ( table , "t" ) . Fields ( "min(t.id)" ) . Where ( "id > 1" ) . Value ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( value . Int ( ) , 2 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
value , err := db . Model ( table , "t" ) . Fields ( "max(t.id)" ) . Where ( "id > 1" ) . Value ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( value . Int ( ) , 10 )
} )
}
func Test_Model_Fields_AutoMapping ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
value , err := db . Model ( table ) . Fields ( "ID" ) . Where ( "id" , 2 ) . Value ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( value . Int ( ) , 2 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
value , err := db . Model ( table ) . Fields ( "NICK_NAME" ) . Where ( "id" , 2 ) . Value ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . Where ( "id" , 2 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . Where ( "id" , 2 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 )
// "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(),
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
value , err := db . Model ( table ) . FieldsEx ( "Passport, Password, NickName, CreateTime" ) . Where ( "id" , 2 ) . Value ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( value . Int ( ) , 2 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
value , err := db . Model ( table ) . FieldsEx ( "ID, Passport, Password, CreateTime" ) . Where ( "id" , 2 ) . Value ( ctx )
2022-06-06 19:57:53 +08:00
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 ,
2025-05-06 20:08:27 +08:00
} ) . Where ( "id" , 2 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 {
Passport int
Password int
CreateTime int
}
one , err := db . Model ( table ) . FieldsEx ( & T {
Passport : 0 ,
Password : 0 ,
CreateTime : 0 ,
2025-05-06 20:08:27 +08:00
} ) . Where ( "id" , 2 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( one ) , 2 )
t . Assert ( one [ "id" ] , 2 )
t . Assert ( one [ "nickname" ] , "name_2" )
} )
}
func Test_Model_Fields_Struct ( t * testing . T ) {
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 ) {
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Fields ( A { } ) . Where ( "id" , 2 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Fields ( & A { } ) . Where ( "id" , 2 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Fields ( B { } ) . Where ( "id" , 2 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . Fields ( & B { } ) . Where ( "id" , 2 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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_Empty_Slice_Argument ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( ` id ` , g . Slice { } ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , 0 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( ` id in(?) ` , g . Slice { } ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , 0 )
} )
}
func Test_Model_HasTable ( t * testing . T ) {
table := createTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2023-11-20 20:47:26 +08:00
t . AssertNil ( db . GetCore ( ) . ClearCacheAll ( ctx ) )
2025-05-06 20:08:27 +08:00
result , err := db . GetCore ( ) . HasTable ( ctx , table )
2022-06-06 19:57:53 +08:00
t . Assert ( result , true )
t . AssertNil ( err )
} )
gtest . C ( t , func ( t * gtest . T ) {
2023-11-20 20:47:26 +08:00
t . AssertNil ( db . GetCore ( ) . ClearCacheAll ( ctx ) )
2025-05-06 20:08:27 +08:00
result , err := db . GetCore ( ) . HasTable ( ctx , "table12321" )
2022-06-06 19:57:53 +08:00
t . Assert ( result , false )
t . AssertNil ( err )
} )
}
func Test_Model_HasField ( t * testing . T ) {
table := createTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . HasField ( ctx , "id" )
2022-06-06 19:57:53 +08:00
t . Assert ( result , true )
t . AssertNil ( err )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . HasField ( ctx , "id123" )
2022-06-06 19:57:53 +08:00
t . Assert ( result , false )
t . AssertNil ( err )
} )
}
// Issue: https://github.com/gogf/gf/issues/1002
func Test_Model_Issue1002 ( t * testing . T ) {
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" ,
2025-05-06 20:08:27 +08:00
} ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
gtest . AssertNil ( err )
n , _ := result . RowsAffected ( )
gtest . Assert ( n , 1 )
// where + string.
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
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 ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( v . Int ( ) , 1 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
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 ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( v . Int ( ) , 1 )
} )
// where + string arguments.
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
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 ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( v . Int ( ) , 1 )
} )
// where + gtime.Time arguments.
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
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 ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( v . Int ( ) , 1 )
} )
// TODO
// 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")
// {
2025-05-06 20:08:27 +08:00
// v, err := db.Model(table).Fields("id").Where("create_time>? and create_time<?", t1, t2).Value(ctx)
2022-06-06 19:57:53 +08:00
// t.AssertNil(err)
// t.Assert(v.Int(), 1)
// }
// })
}
func createTableForTimeZoneTest ( ) string {
tableName := "user_" + gtime . Now ( ) . TimestampNanoStr ( )
if _ , err := db . Exec ( ctx , fmt . Sprintf ( `
CREATE TABLE IF NOT EXISTS % s (
id INTEGER PRIMARY KEY AUTOINCREMENT
UNIQUE
NOT NULL ,
passport varchar ( 45 ) NULL ,
password char ( 32 ) NULL ,
nickname varchar ( 45 ) NULL ,
created_at timestamp NULL ,
updated_at timestamp NULL ,
deleted_at timestamp NULL
) ;
` , 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 )
tokyoLoc , err := time . LoadLocation ( "Asia/Tokyo" )
gtest . AssertNil ( err )
CreateTime := "2020-11-22 12:23:45"
UpdateTime := "2020-11-22 13:23:45"
DeleteTime := "2020-11-22 14:23:45"
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 ) {
2025-05-06 20:08:27 +08:00
_ , _ = db . Model ( tableName ) . Unscoped ( ) . Data ( u ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
userEntity := & User { }
2025-05-06 20:08:27 +08:00
err := db . Model ( tableName ) . Where ( "id" , 1 ) . Unscoped ( ) . Scan ( ctx , & userEntity )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
// TODO
// t.Assert(userEntity.CreatedAt.String(), "2020-11-22 11:23:45")
// t.Assert(userEntity.UpdatedAt.String(), "2020-11-22 12:23:45")
// t.Assert(gtime.NewFromTime(userEntity.DeletedAt).String(), "2020-11-22 13:23:45")
} )
}
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 ,
2025-05-06 20:08:27 +08:00
} ) . Where ( "id" , 1 ) . One ( ctx )
2022-06-06 19:57:53 +08:00
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 { }
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Fields ( a ) . Where ( "id" , 1 ) . Scan ( ctx , & a )
2022-06-06 19:57:53 +08:00
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
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Fields ( a ) . Where ( "id" , 1 ) . Scan ( ctx , & a )
2022-06-06 19:57:53 +08:00
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
2025-05-06 20:08:27 +08:00
err := db . Model ( table ) . Fields ( & a ) . Where ( "id" , 1 ) . Scan ( ctx , & a )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( a . ID , 1 )
t . Assert ( a . PASSPORT , "user_1" )
t . Assert ( a . XXX_TYPE , 0 )
} )
}
func Test_Model_WhereIn ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereIn ( "id" , g . Slice { 1 , 2 , 3 , 4 } ) . WhereIn ( "id" , g . Slice { 3 , 4 , 5 } ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereIn ( "id" , g . Slice { } ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , 0 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . OmitEmptyWhere ( ) . WhereIn ( "id" , g . Slice { } ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereNotIn ( "id" , g . Slice { 1 , 2 , 3 , 4 } ) . WhereNotIn ( "id" , g . Slice { 3 , 4 , 5 } ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereOrIn ( "id" , g . Slice { 1 , 2 , 3 , 4 } ) . WhereOrIn ( "id" , g . Slice { 3 , 4 , 5 } ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereOrNotIn ( "id" , g . Slice { 1 , 2 , 3 , 4 } ) . WhereOrNotIn ( "id" , g . Slice { 3 , 4 , 5 } ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereBetween ( "id" , 1 , 4 ) . WhereBetween ( "id" , 3 , 5 ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereNotBetween ( "id" , 2 , 8 ) . WhereNotBetween ( "id" , 3 , 100 ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereOrBetween ( "id" , 1 , 4 ) . WhereOrBetween ( "id" , 3 , 5 ) . OrderDesc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 )
// db.SetDebug(true)
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereOrNotBetween ( "id" , 1 , 4 ) . WhereOrNotBetween ( "id" , 3 , 5 ) . OrderDesc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereLike ( "nickname" , "name%" ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereNotLike ( "nickname" , "name%" ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereOrLike ( "nickname" , "namexxx%" ) . WhereOrLike ( "nickname" , "name%" ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereOrNotLike ( "nickname" , "namexxx%" ) . WhereOrNotLike ( "nickname" , "name%" ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereNull ( "nickname" ) . WhereNull ( "passport" ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereNotNull ( "nickname" ) . WhereNotNull ( "passport" ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , TableSize )
t . Assert ( result [ 0 ] [ "id" ] , 1 )
t . Assert ( result [ TableSize - 1 ] [ "id" ] , TableSize )
} )
}
func Test_Model_WhereOrNotNull ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereOrNotNull ( "nickname" ) . WhereOrNotNull ( "passport" ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , TableSize )
t . Assert ( result [ 0 ] [ "id" ] , 1 )
t . Assert ( result [ TableSize - 1 ] [ "id" ] , TableSize )
} )
}
func Test_Model_WhereLT ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereLT ( "id" , 3 ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereLTE ( "id" , 3 ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereGT ( "id" , 8 ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereGTE ( "id" , 8 ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereLT ( "id" , 3 ) . WhereOrLT ( "id" , 4 ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereLTE ( "id" , 3 ) . WhereOrLTE ( "id" , 4 ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereGT ( "id" , 8 ) . WhereOrGT ( "id" , 7 ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereGTE ( "id" , 8 ) . WhereOrGTE ( "id" , 7 ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , 4 )
t . Assert ( result [ 0 ] [ "id" ] , 7 )
} )
}
func Test_Model_Min_Max_Avg_Sum ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Min ( ctx , "id" )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result , 1 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Max ( ctx , "id" )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result , TableSize )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Avg ( ctx , "id" )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result , 5.5 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Sum ( ctx , "id" )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result , 55 )
} )
}
func Test_Model_CountColumn ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . CountColumn ( ctx , "id" )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( result , TableSize )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . WhereIn ( "id" , g . Slice { 1 , 2 , 3 } ) . CountColumn ( ctx , "id" )
2022-06-06 19:57:53 +08:00
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" ,
"create_time" : gtime . Now ( ) . String ( ) ,
2025-05-06 20:08:27 +08:00
} ) . InsertAndGetId ( ctx )
2022-06-06 19:57:53 +08:00
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" ,
"create_time" : gtime . Now ( ) . String ( ) ,
2025-05-06 20:08:27 +08:00
} ) . InsertAndGetId ( ctx )
2022-06-06 19:57:53 +08:00
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 ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id" , 1 ) . Increment ( ctx , "id" , 100 )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
rows , _ := result . RowsAffected ( )
t . Assert ( rows , 1 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Where ( "id" , 101 ) . Decrement ( ctx , "id" , 10 )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
rows , _ := result . RowsAffected ( )
t . Assert ( rows , 1 )
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . Where ( "id" , 91 ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( 1 ) )
2022-06-06 19:57:53 +08:00
} )
}
func Test_Model_Raw ( t * testing . T ) {
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 ) .
2025-05-06 20:08:27 +08:00
All ( ctx )
2022-06-06 19:57:53 +08:00
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 ) .
2025-05-06 20:08:27 +08:00
Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( 6 ) )
2022-06-06 19:57:53 +08:00
} )
}
func Test_Model_Handler ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
m := db . Model ( table ) . Handler (
func ( ctx context . Context , m * gdb . Model ) * gdb . Model {
2022-06-06 19:57:53 +08:00
return m . Page ( 0 , 3 )
} ,
2025-05-06 20:08:27 +08:00
func ( ctx context . Context , m * gdb . Model ) * gdb . Model {
2022-06-06 19:57:53 +08:00
return m . Where ( "id" , g . Slice { 1 , 2 , 3 , 4 , 5 , 6 } )
} ,
2025-05-06 20:08:27 +08:00
func ( ctx context . Context , m * gdb . Model ) * gdb . Model {
2022-06-06 19:57:53 +08:00
return m . OrderDesc ( "id" )
} ,
)
2025-05-06 20:08:27 +08:00
all , err := m . All ( ctx )
2022-06-06 19:57:53 +08:00
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 )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
all , err := db . Model ( table ) . Fields ( "id" ) . FieldCount ( "id" , "total" ) . Group ( "id" ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( all ) , TableSize )
t . Assert ( all [ 0 ] [ "id" ] , 1 )
2023-06-28 10:06:33 +08:00
t . Assert ( all [ 0 ] [ "total" ] . Int ( ) , 1 )
2022-06-06 19:57:53 +08:00
} )
}
func Test_Model_FieldMax ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
all , err := db . Model ( table ) . Fields ( "id" ) . FieldMax ( "id" , "total" ) . Group ( "id" ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( all ) , TableSize )
t . Assert ( all [ 0 ] [ "id" ] , 1 )
2023-06-28 10:06:33 +08:00
t . Assert ( all [ 0 ] [ "total" ] . Int ( ) , 1 )
2022-06-06 19:57:53 +08:00
} )
}
func Test_Model_FieldMin ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
all , err := db . Model ( table ) . Fields ( "id" ) . FieldMin ( "id" , "total" ) . Group ( "id" ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( all ) , TableSize )
t . Assert ( all [ 0 ] [ "id" ] , 1 )
2023-06-28 10:06:33 +08:00
t . Assert ( all [ 0 ] [ "total" ] . Int ( ) , 1 )
2022-06-06 19:57:53 +08:00
} )
}
func Test_Model_FieldAvg ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
all , err := db . Model ( table ) . Fields ( "id" ) . FieldAvg ( "id" , "total" ) . Group ( "id" ) . OrderAsc ( "id" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( all ) , TableSize )
t . Assert ( all [ 0 ] [ "id" ] , 1 )
2023-06-28 10:06:33 +08:00
t . Assert ( all [ 0 ] [ "total" ] . Int ( ) , 1 )
2022-06-06 19:57:53 +08:00
} )
}
func Test_Model_OmitEmptyWhere ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
// Basic type where.
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . Where ( "id" , 0 ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( 0 ) )
2022-06-06 19:57:53 +08:00
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . OmitEmptyWhere ( ) . Where ( "id" , 0 ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( TableSize ) )
2022-06-06 19:57:53 +08:00
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . OmitEmptyWhere ( ) . Where ( "id" , 0 ) . Where ( "nickname" , "" ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( TableSize ) )
2022-06-06 19:57:53 +08:00
} )
// Slice where.
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . Where ( "id" , g . Slice { 1 , 2 , 3 } ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( 3 ) )
2022-06-06 19:57:53 +08:00
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . Where ( "id" , g . Slice { } ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( 0 ) )
2022-06-06 19:57:53 +08:00
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . OmitEmptyWhere ( ) . Where ( "id" , g . Slice { } ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( TableSize ) )
2022-06-06 19:57:53 +08:00
} )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . Where ( "id" , g . Slice { } ) . OmitEmptyWhere ( ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( TableSize ) )
2022-06-06 19:57:53 +08:00
} )
// Struct Where.
gtest . C ( t , func ( t * gtest . T ) {
type Input struct {
Id [ ] int
Name [ ] string
}
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . Where ( Input { } ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( 0 ) )
2022-06-06 19:57:53 +08:00
} )
gtest . C ( t , func ( t * gtest . T ) {
type Input struct {
Id [ ] int
Name [ ] string
}
2025-05-06 20:08:27 +08:00
count , err := db . Model ( table ) . Where ( Input { } ) . OmitEmptyWhere ( ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( TableSize ) )
2022-06-06 19:57:53 +08:00
} )
// Map Where.
gtest . C ( t , func ( t * gtest . T ) {
count , err := db . Model ( table ) . Where ( g . Map {
"id" : [ ] int { } ,
"nickname" : [ ] string { } ,
2025-05-06 20:08:27 +08:00
} ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( 0 ) )
2022-06-06 19:57:53 +08:00
} )
gtest . C ( t , func ( t * gtest . T ) {
count , err := db . Model ( table ) . Where ( g . Map {
"id" : [ ] int { } ,
2025-05-06 20:08:27 +08:00
} ) . OmitEmptyWhere ( ) . Count ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
2022-11-17 19:47:17 +08:00
t . Assert ( count , int64 ( TableSize ) )
2022-06-06 19:57:53 +08:00
} )
}
// https://github.com/gogf/gf/issues/1387
func Test_Model_GTime_DefaultValue ( t * testing . T ) {
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" ,
CreateTime : gtime . Now ( ) ,
}
// Insert
2025-05-06 20:08:27 +08:00
_ , err := db . Model ( table ) . Data ( data ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
// Select
var (
user * User
)
2025-05-06 20:08:27 +08:00
err = db . Model ( table ) . Scan ( ctx , & user )
2022-06-06 19:57:53 +08:00
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
2025-05-06 20:08:27 +08:00
_ , err = db . Model ( table ) . Data ( user ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
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 ( ) ,
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Data ( data ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
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 ( ) ,
} ,
}
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . Data ( data ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := result . LastInsertId ( )
t . Assert ( n , 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 ( ) ,
} ,
2025-05-06 20:08:27 +08:00
} ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
n , _ := result . RowsAffected ( )
t . Assert ( n , 1 )
var user * User
2025-05-06 20:08:27 +08:00
err = db . Model ( table ) . Fields ( user ) . Where ( "id=100" ) . Scan ( ctx , & user )
2022-06-06 19:57:53 +08:00
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.
func Test_Model_Insert_KeyFieldNameMapping_Error ( t * testing . T ) {
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
2023-11-08 21:26:51 +08:00
NoneExistField string
2022-06-06 19:57:53 +08:00
}
data := User {
Id : 1 ,
Passport : "user_1" ,
Password : "pass_1" ,
Nickname : "name_1" ,
CreateTime : "2020-10-10 12:00:01" ,
}
2025-05-06 20:08:27 +08:00
_ , err := db . Model ( table ) . Data ( data ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
} )
}
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 ( `
CREATE TABLE IF NOT EXISTS % s (
id INTEGER PRIMARY KEY AUTOINCREMENT
UNIQUE
NOT NULL ,
name varchar ( 500 ) NOT NULL DEFAULT ' '
) ;
` , table1 ,
) ) ; err != nil {
t . AssertNil ( err )
}
defer dropTable ( table1 )
2025-05-06 20:08:27 +08:00
_ , err = db . Model ( table1 ) . Data ( g . Map {
2022-06-06 19:57:53 +08:00
"id" : 1 ,
"name" : "john" ,
2025-05-06 20:08:27 +08:00
} ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
if _ , err := db . Exec ( ctx , fmt . Sprintf ( `
CREATE TABLE IF NOT EXISTS % s (
id INTEGER PRIMARY KEY AUTOINCREMENT
UNIQUE
NOT NULL ,
user_id int ( 11 ) NOT NULL DEFAULT 0 ,
number varchar ( 500 ) NOT NULL DEFAULT ' '
) ;
` , table2 ,
) ) ; err != nil {
t . AssertNil ( err )
}
defer dropTable ( table2 )
2025-05-06 20:08:27 +08:00
_ , err = db . Model ( table2 ) . Data ( g . Map {
2022-06-06 19:57:53 +08:00
"id" : 1 ,
"user_id" : 1 ,
"number" : "n" ,
2025-05-06 20:08:27 +08:00
} ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
if _ , err := db . Exec ( ctx , fmt . Sprintf ( `
CREATE TABLE IF NOT EXISTS % s (
id INTEGER PRIMARY KEY AUTOINCREMENT
UNIQUE
NOT NULL ,
user_id int ( 11 ) NOT NULL DEFAULT 0 ,
description varchar ( 500 ) NOT NULL DEFAULT ' '
) ;
` , table3 ,
) ) ; err != nil {
t . AssertNil ( err )
}
defer dropTable ( table3 )
2025-05-06 20:08:27 +08:00
_ , err = db . Model ( table3 ) . Data ( g . Map {
2022-06-06 19:57:53 +08:00
"id" : 1 ,
"user_id" : 1 ,
"description" : "brief" ,
2025-05-06 20:08:27 +08:00
} ) . Insert ( ctx )
2022-06-06 19:57:53 +08:00
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" ) .
2025-05-06 20:08:27 +08:00
One ( ctx )
2022-06-06 19:57:53 +08:00
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" ) .
2025-05-06 20:08:27 +08:00
One ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( one ) , 2 )
t . Assert ( one [ "name" ] . String ( ) , "john" )
t . Assert ( one [ "number" ] . String ( ) , "n" )
} )
}
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 } ,
} ) .
2025-05-06 20:08:27 +08:00
Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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 } ,
} ) .
2025-05-06 20:08:27 +08:00
Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
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%" ) .
2025-05-06 20:08:27 +08:00
Order ( "id asc" ) . All ( ctx )
2022-06-06 19:57:53 +08:00
t . AssertNil ( err )
t . Assert ( len ( r ) , 1 )
t . Assert ( r [ 0 ] [ "id" ] , "3" )
} )
}
// 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" : gvar . New ( 1 ) ,
"name" : gvar . New ( "john" ) ,
"age" : gvar . New ( 16 ) ,
} ,
gdb . Record {
"id" : gvar . New ( 2 ) ,
"name" : gvar . New ( "smith" ) ,
"age" : gvar . New ( 18 ) ,
} ,
}
2025-05-06 20:08:27 +08:00
err = r1 . ScanList ( ctx , & s , "One" )
2022-06-06 19:57:53 +08:00
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" : gvar . New ( 1 ) ,
"age" : gvar . New ( 20 ) ,
} ,
gdb . Record {
"id" : gvar . New ( 2 ) ,
"age" : gvar . New ( 21 ) ,
} ,
}
2025-05-06 20:08:27 +08:00
err = r2 . ScanList ( ctx , & s , "One" , "One" , "id:Id" )
2022-06-06 19:57:53 +08:00
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" : gvar . New ( 1 ) ,
"name" : gvar . New ( "john" ) ,
"age" : gvar . New ( 16 ) ,
} ,
gdb . Record {
"id" : gvar . New ( 2 ) ,
"name" : gvar . New ( "smith" ) ,
"age" : gvar . New ( 18 ) ,
} ,
}
2025-05-06 20:08:27 +08:00
err = r1 . ScanList ( ctx , & s , "One" )
2022-06-06 19:57:53 +08:00
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" : gvar . New ( 1 ) ,
"age" : gvar . New ( 20 ) ,
} ,
gdb . Record {
"id" : gvar . New ( 2 ) ,
"age" : gvar . New ( 21 ) ,
} ,
}
2025-05-06 20:08:27 +08:00
err = r2 . ScanList ( ctx , & s , "One" , "One" , "id:Id" )
2022-06-06 19:57:53 +08:00
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" : gvar . New ( 1 ) ,
"name" : gvar . New ( "john" ) ,
"age" : gvar . New ( 16 ) ,
} ,
gdb . Record {
"id" : gvar . New ( 2 ) ,
"name" : gvar . New ( "smith" ) ,
"age" : gvar . New ( 18 ) ,
} ,
}
2025-05-06 20:08:27 +08:00
err = r1 . ScanList ( ctx , & s , "One" )
2022-06-06 19:57:53 +08:00
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" : gvar . New ( 100 ) ,
"pid" : gvar . New ( 1 ) ,
"age" : gvar . New ( 30 ) ,
"name" : gvar . New ( "john" ) ,
} ,
gdb . Record {
"id" : gvar . New ( 200 ) ,
"pid" : gvar . New ( 1 ) ,
"age" : gvar . New ( 31 ) ,
"name" : gvar . New ( "smith" ) ,
} ,
}
2025-05-06 20:08:27 +08:00
err = r2 . ScanList ( ctx , & s , "Many" , "One" , "pid:Id" )
2022-06-06 19:57:53 +08:00
// 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 )
r3 := gdb . Result {
gdb . Record {
"id" : gvar . New ( 100 ) ,
"pid" : gvar . New ( 1 ) ,
"age" : gvar . New ( 40 ) ,
} ,
gdb . Record {
"id" : gvar . New ( 200 ) ,
"pid" : gvar . New ( 1 ) ,
"age" : gvar . New ( 41 ) ,
} ,
}
2025-05-06 20:08:27 +08:00
err = r3 . ScanList ( ctx , & s , "Many" , "One" , "pid:Id" )
2022-06-06 19:57:53 +08:00
// 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 )
} )
}
// 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" : gvar . New ( 1 ) ,
"name" : gvar . New ( "john" ) ,
"age" : gvar . New ( 16 ) ,
} ,
gdb . Record {
"id" : gvar . New ( 2 ) ,
"name" : gvar . New ( "smith" ) ,
"age" : gvar . New ( 18 ) ,
} ,
}
2025-05-06 20:08:27 +08:00
err = r1 . ScanList ( ctx , & s , "One" )
2022-06-06 19:57:53 +08:00
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" : gvar . New ( 100 ) ,
"pid" : gvar . New ( 1 ) ,
"age" : gvar . New ( 30 ) ,
"name" : gvar . New ( "john" ) ,
} ,
gdb . Record {
"id" : gvar . New ( 200 ) ,
"pid" : gvar . New ( 1 ) ,
"age" : gvar . New ( 31 ) ,
"name" : gvar . New ( "smith" ) ,
} ,
}
2025-05-06 20:08:27 +08:00
err = r2 . ScanList ( ctx , & s , "Many" , "One" , "pid:Id" )
2022-06-06 19:57:53 +08:00
// 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 )
r3 := gdb . Result {
gdb . Record {
"id" : gvar . New ( 100 ) ,
"pid" : gvar . New ( 1 ) ,
"age" : gvar . New ( 40 ) ,
} ,
gdb . Record {
"id" : gvar . New ( 200 ) ,
"pid" : gvar . New ( 1 ) ,
"age" : gvar . New ( 41 ) ,
} ,
}
2025-05-06 20:08:27 +08:00
err = r3 . ScanList ( ctx , & s , "Many" , "One" , "pid:Id" )
2022-06-06 19:57:53 +08:00
// 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 )
} )
}
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" : gvar . New ( nil ) , "name" : gvar . New ( "john" ) } ,
gdb . Record { "id" : gvar . New ( nil ) , "name" : gvar . New ( "smith" ) } ,
}
array := make ( [ ] * B , 2 )
err := r . Structs ( & array )
t . AssertNil ( err )
t . Assert ( array [ 0 ] . Id , 0 )
t . Assert ( array [ 1 ] . Id , 0 )
t . Assert ( array [ 0 ] . Name , "john" )
t . Assert ( array [ 1 ] . Name , "smith" )
} )
}
2024-09-24 11:58:34 +08:00
func Test_OrderRandom ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
gtest . C ( t , func ( t * gtest . T ) {
2025-05-06 20:08:27 +08:00
result , err := db . Model ( table ) . OrderRandom ( ) . All ( ctx )
2024-09-24 11:58:34 +08:00
t . AssertNil ( err )
t . Assert ( len ( result ) , TableSize )
} )
}
2024-12-26 18:18:35 +08:00
func Test_Model_OnDuplicateWithCounter ( t * testing . T ) {
table := createInitTable ( )
defer dropTable ( table )
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 ) . OnConflict ( "id" ) . OnDuplicate ( g . Map {
"id" : gdb . Counter { Field : "id" , Value : 999999 } ,
2025-05-06 20:08:27 +08:00
} ) . Data ( data ) . Save ( ctx )
2024-12-26 18:18:35 +08:00
t . AssertNil ( err )
2025-05-06 20:08:27 +08:00
one , err := db . Model ( table ) . WherePri ( 1 ) . One ( ctx )
2024-12-26 18:18:35 +08:00
t . AssertNil ( err )
t . AssertNil ( one )
} )
}