From 20eef8e47d70a2d13cba233ece0940baa3fcb783 Mon Sep 17 00:00:00 2001 From: macq Date: Thu, 14 Sep 2017 14:16:11 +0800 Subject: [PATCH] =?UTF-8?q?insert=E7=9A=84=E6=97=B6=E5=80=99=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=8D=95=E4=B8=BB=E9=94=AE=E7=9A=84=E9=80=92=E5=BD=92?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- session_convert.go | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/session_convert.go b/session_convert.go index f2c949ba..8e23af3d 100644 --- a/session_convert.go +++ b/session_convert.go @@ -585,22 +585,35 @@ func (session *Session) value2Interface(col *core.Column, fieldValue reflect.Val tf := session.engine.formatColTime(col, t) return tf, nil } - if !col.SQLType.IsJson() { // !! 增加支持driver.Valuer接口的结构,如sql.NullString if v, ok := fieldValue.Interface().(driver.Valuer); ok { return v.Value() } + var getfiled func(fv reflect.Value) (*reflect.Value, error) + getfiled = func(fv reflect.Value) (*reflect.Value, error) { + fieldTable, err := session.engine.autoMapType(fv) + if err != nil { + return nil, err + } + if len(fieldTable.PrimaryKeys) == 1 { - fieldTable, err := session.engine.autoMapType(fieldValue) + pkField := reflect.Indirect(reflect.Indirect(fv).FieldByName(fieldTable.PKColumns()[0].FieldName)) + + if pkField.Kind() == reflect.Struct { + + return getfiled(pkField) + } + return &pkField, nil + } + return nil, fmt.Errorf("no primary key for col %v", col.Name) + } + pkField, err := getfiled(fieldValue) if err != nil { - return nil, err + return 0, err } - if len(fieldTable.PrimaryKeys) == 1 { - pkField := reflect.Indirect(fieldValue).FieldByName(fieldTable.PKColumns()[0].FieldName) - return pkField.Interface(), nil - } - return 0, fmt.Errorf("no primary key for col %v", col.Name) + return pkField.Interface(), nil + } if col.SQLType.IsText() {