From 486fd425490afd93ce2f965fe3ba46e5999ca750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=AA=E5=9D=A4=E5=AE=89?= Date: Mon, 3 Apr 2023 02:45:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96func=20(session=20*Session)?= =?UTF-8?q?=20slice2Bean=E6=96=B9=E6=B3=95=E4=B8=AD=E7=9A=84strings.ToLowe?= =?UTF-8?q?r=E4=BB=A5=E5=8F=8A=E5=87=8F=E5=B0=91map=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=92=8C=E8=AE=BF=E9=97=AE=E6=AC=A1=E6=95=B0=EF=BC=88=E5=AF=B9?= =?UTF-8?q?=E5=BA=94issue=E4=B8=BA:=20https://gitea.com/xorm/xorm/issues/2?= =?UTF-8?q?243=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- session.go | 12 ++++++------ session_find.go | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/session.go b/session.go index 67fedd70..a9b9f863 100644 --- a/session.go +++ b/session.go @@ -393,10 +393,10 @@ func (session *Session) doPrepareTx(sqlStr string) (stmt *core.Stmt, err error) return } -func getField(dataStruct *reflect.Value, table *schemas.Table, colName string, idx int) (*schemas.Column, *reflect.Value, error) { - col := table.GetColumnIdx(colName, idx) +func getField(dataStruct *reflect.Value, table *schemas.Table, field *QueryedField) (*schemas.Column, *reflect.Value, error) { + col := field.ColumnSchema if col == nil { - return nil, nil, ErrFieldIsNotExist{colName, table.Name} + return nil, nil, ErrFieldIsNotExist{field.FieldName, table.Name} } fieldValue, err := col.ValueOfV(dataStruct) @@ -404,10 +404,10 @@ func getField(dataStruct *reflect.Value, table *schemas.Table, colName string, i return nil, nil, err } if fieldValue == nil { - return nil, nil, ErrFieldIsNotValid{colName, table.Name} + return nil, nil, ErrFieldIsNotValid{field.FieldName, table.Name} } if !fieldValue.IsValid() || !fieldValue.CanSet() { - return nil, nil, ErrFieldIsNotValid{colName, table.Name} + return nil, nil, ErrFieldIsNotValid{field.FieldName, table.Name} } return col, fieldValue, nil @@ -712,7 +712,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, allColum *AllColum var pk schemas.PK for i, field := range allColum.Fields { - col, fieldValue, err := getField(dataStruct, table, field.FieldName, field.TempIndex) + col, fieldValue, err := getField(dataStruct, table, field) if _, ok := err.(ErrFieldIsNotExist); ok { continue } else if err != nil { diff --git a/session_find.go b/session_find.go index e0b8d295..0dcb2da7 100644 --- a/session_find.go +++ b/session_find.go @@ -168,6 +168,7 @@ type QueryedField struct { LowerFieldName string ColumnType *sql.ColumnType TempIndex int + ColumnSchema *schemas.Column } type AllColumn struct { @@ -176,6 +177,19 @@ type AllColumn struct { Types []*sql.ColumnType } +func (allColumn *AllColumn) ParseTableSchema(table *schemas.Table) error { + for _, field := range allColumn.Fields { + col := table.GetColumnIdx(field.FieldName, field.TempIndex) + if col == nil { + return ErrFieldIsNotExist{FieldName: field.FieldName, TableName: table.Name} + } + + field.ColumnSchema = col + } + + return nil +} + func ParseQueryRows(fieldNames []string, types []*sql.ColumnType) *AllColumn { var allColumn AllColumn @@ -289,6 +303,12 @@ func (session *Session) noCacheFind(table *schemas.Table, containerValue reflect if err != nil { return err } + + parseTableSchemaError := allColumn.ParseTableSchema(tb) + if parseTableSchemaError != nil { + return parseTableSchemaError + } + err = session.rows2Beans(rows, allColumn, fields, types, tb, newElemFunc, containerValueSetFunc) rows.Close() if err != nil {