From 79f10b575a8e3838b0ea9a71ca1185042c710d82 Mon Sep 17 00:00:00 2001 From: tuuz Date: Mon, 13 Nov 2023 13:55:29 +0800 Subject: [PATCH] =?UTF-8?q?Beta:=E6=96=B0=E5=A2=9Edb.Scan(struct)=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E4=BC=A0=E5=85=A5struct{}=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=8D=95=E6=9D=A1=EF=BC=8C=E7=B1=BB=E4=BC=BC?= =?UTF-8?q?Find=E6=96=B9=E6=B3=95=EF=BC=8C=E4=BC=A0=E5=85=A5[]struct{}?= =?UTF-8?q?=E5=B0=86=E4=BC=9A=E8=A7=A3=E6=9E=90=E6=88=90=E5=A4=9A=E6=9D=A1?= =?UTF-8?q?=EF=BC=8C=E7=B1=BB=E4=BC=BCGet=E6=96=B9=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E6=B3=A8=E6=84=8F=E9=9C=80=E8=A6=81=E4=BC=A0=E5=85=A5=E6=8C=87?= =?UTF-8?q?=E9=92=88=E5=80=BC=EF=BC=8C=E4=BE=8B=E5=A6=82=E4=BC=A0=E5=85=A5?= =?UTF-8?q?=EF=BC=9A&User{},=E8=80=8C=E4=B8=8D=E6=98=AF=EF=BC=9AUser{}?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E8=A6=81=E7=94=A8=E8=BF=99=E4=B8=AA=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E4=BC=A0=E5=85=A5Map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- orm_query.go | 60 +++++++++++++++++++++++++++++++++++++++++- orm_query_interface.go | 2 ++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/orm_query.go b/orm_query.go index d156862..3a681a1 100644 --- a/orm_query.go +++ b/orm_query.go @@ -1,6 +1,7 @@ package gorose import ( + "errors" "github.com/gohouse/t" "math" "reflect" @@ -20,12 +21,69 @@ func (dba *Orm) Select() error { if err != nil { return err } - // 执行查询 _, err = dba.GetISession().Query(sqlStr, args...) return err } +func (dba *Orm) Scan(scan_to_struct any) error { + dstVal := reflect.ValueOf(scan_to_struct) + sliceVal := reflect.Indirect(dstVal) + switch sliceVal.Kind() { + case reflect.Struct: // struct + dba.GetIBinder().SetBindType(OBJECT_STRUCT) + dba.GetIBinder().SetBindResult(scan_to_struct) + if len(dba.GetIBinder().GetBindFields()) == 0 { + dba.GetIBinder().SetBindFields(getTagName(dba.GetIBinder().GetBindResult(), TAGNAME)) + } + switch dstVal.Kind() { + case reflect.Ptr, reflect.Struct: + break + default: + return errors.New("传入的对象有误,示例:var user User,传入 &user{}") + } + dba.Limit(1) + sqlStr, args, err := dba.BuildSql() + if err != nil { + return err + } + _, err = dba.GetISession().Query(sqlStr, args...) + return err + + case reflect.Slice: + eltType := sliceVal.Type().Elem() + switch eltType.Kind() { + case reflect.Struct: + dba.GetIBinder().SetBindType(OBJECT_STRUCT_SLICE) + br := reflect.New(eltType) + dba.GetIBinder().SetBindResult(br.Interface()) + dba.GetIBinder().SetBindResultSlice(sliceVal) + if len(dba.GetIBinder().GetBindFields()) == 0 { + dba.GetIBinder().SetBindFields(getTagName(dba.GetIBinder().GetBindResult(), TAGNAME)) + } + switch dstVal.Kind() { + case reflect.Ptr, reflect.Struct: + break + default: + return errors.New("传入的对象有误,示例:var user User,传入 &user{}") + } + sqlStr, args, err := dba.BuildSql() + if err != nil { + return err + } + _, err = dba.GetISession().Query(sqlStr, args...) + return err + + default: + return errors.New("传入[]struct{}将会解析成多条,类似Get方法,注意需要传入指针值,例如传入:&User{},而不是:User{},不要用这个方法传入Map") + + } + + default: + return errors.New("传入struct{}可以解析单条,类似Find方法,传入[]struct{}将会解析成多条,类似Get方法,注意需要传入指针值,例如传入:&User{},而不是:User{},不要用这个方法传入Map") + } +} + // First : select one row , relation limit set func (dba *Orm) First() (result Data, err error) { dba.GetIBinder().SetBindType(OBJECT_STRING) diff --git a/orm_query_interface.go b/orm_query_interface.go index 30bb73c..050a3f7 100644 --- a/orm_query_interface.go +++ b/orm_query_interface.go @@ -5,6 +5,8 @@ type IOrmQuery interface { // 获取数据, 依据传入的绑定对象, 选择查询一条或多条数据并绑定到传入对象上 // 当绑定对象传入的是string类型时, 返回多条结果集, 需要使用 Get() 来获取最终结果 Select() error + //Scan 方法传入struct{}可以解析单条,类似Find方法,输入[]struct{}将会解析成多条,类似Get方法 + Scan(scan_to_struct any) error // 获取一条结果并返回, 只有当传入的table对象是字符串时生效 First() (Data, error) Find() (Data, error)