Skip to content

Scan将结果独立输出到struct

Tuuz edited this page Nov 13, 2023 · 1 revision

Scan说明

原版没有提供Scan方法,Scan方法为内置提供给本体类使用,新版相当于仅对Struct做了支持,Scan方法理论上来说不会支持你将Map导入,如果你需要使用Map你可以使用原版Get和Find方法,在业务代码中,如非必须,请尽可能使用自释性代码编程思想

Scan目的

Scan方法在这里与原版有设计上没有太大差异,相当于提供了一个输出方法,在保留了原始用法的时候,向习惯eloquent填写表名操作的用户提供一个捷径方法,使开发人员能更方便的将数据从数据库直接读取入Struct结构体中

Scan的新增考量

在未来如果你的系统需要主动添加Redis或GorosePro未来内置了Redis缓存或ES数据直上功能后,使用Scan方法可以大大方便你的开发行为

Scan的兼容性以及v1.13版本对之前的整体兼容性说明

原版你需要使用db.Table(YourStructName),并在配置文件中配置prefix,最终使用db.Select()来读取数据,在大型项目中这没问题,但是外包开发团队可能因为某种原因需要使用多重prefix,原版框架在这里如果需要做直读,就需要不配置prefix,并将struct的名称前面手动加上prefix或tag,变成db.Table(PrefixYourStructName),当然你有很多理由来说明这样做的好处,所以,在此我保留了原始的方法,你依然可以使用原方法来设定db.Table(),你可以放心升级

Scan的简单用法说明

新版方法中你可以直接使用db.Table("tablename").Where(xxxx).Scan(YourStructName)来直接解析,效果和原版一致,但无需再次执行Select方法

Demo

StructDemo

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
	}
}

业务层使用泛型Go1.18+

泛型单条查询

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
	}
}
Clone this wiki locally