-
Notifications
You must be signed in to change notification settings - Fork 9
Scan将结果独立输出到struct
Tuuz edited this page Nov 13, 2023
·
1 revision
原版没有提供Scan方法,Scan方法为内置提供给本体类使用,新版相当于仅对Struct做了支持,Scan方法理论上来说不会支持你将Map导入,如果你需要使用Map你可以使用原版Get和Find方法,在业务代码中,如非必须,请尽可能使用自释性代码编程思想
Scan方法在这里与原版有设计上没有太大差异,相当于提供了一个输出方法,在保留了原始用法的时候,向习惯eloquent填写表名操作的用户提供一个捷径方法,使开发人员能更方便的将数据从数据库直接读取入Struct结构体中
在未来如果你的系统需要主动添加Redis或GorosePro未来内置了Redis缓存或ES数据直上功能后,使用Scan方法可以大大方便你的开发行为
原版你需要使用db.Table(YourStructName),并在配置文件中配置prefix,最终使用db.Select()来读取数据,在大型项目中这没问题,但是外包开发团队可能因为某种原因需要使用多重prefix,原版框架在这里如果需要做直读,就需要不配置prefix,并将struct的名称前面手动加上prefix或tag,变成db.Table(PrefixYourStructName),当然你有很多理由来说明这样做的好处,所以,在此我保留了原始的方法,你依然可以使用原方法来设定db.Table(),你可以放心升级
新版方法中你可以直接使用db.Table("tablename").Where(xxxx).Scan(YourStructName)来直接解析,效果和原版一致,但无需再次执行Select方法
type FriendList struct {
Id int64
SelfId int64
UserId int64
Nickname string
Remark string
}
func Api_find_struct(user_id any) FriendList {
db := tuuz.Db().Table(table)
where := map[string]any{
"user_id": user_id,
}
db.Where(where)
ret := FriendList{}
err := db.Scan(&ret)
if err != nil {
Log.DBrrsql(err, db, tuuz.FUNCTION_ALL())
return FriendList{}
} else {
return ret
}
}
func Api_select_struct(user_id any) []FriendList {
db := tuuz.Db().Table(table)
if user_id != nil {
db.Where("user_id", user_id)
}
ret := []FriendList{}
err := db.Scan(&ret)
if err != nil {
Log.DBrrsql(err, db, tuuz.FUNCTION_ALL())
return nil
} else {
return ret
}
}
func Api_find_struct[T FriendList](user_id any) T {
db := tuuz.Db().Table(table)
where := map[string]any{
"user_id": user_id,
}
db.Where(where)
ret := T{}
err := db.Scan(&ret)
if err != nil {
Log.DBrrsql(err, db, tuuz.FUNCTION_ALL())
return T{}
} else {
return ret
}
}
func Api_select_struct[T FriendList](user_id any) []T {
db := tuuz.Db().Table(table)
if user_id != nil {
db.Where("user_id", user_id)
}
ret := []T{}
err := db.Scan(&ret)
if err != nil {
Log.DBrrsql(err, db, tuuz.FUNCTION_ALL())
return []T{}
} else {
return ret
}
}