From 7ce0fde171192624f108cf803813dc6251048ba7 Mon Sep 17 00:00:00 2001 From: jianzhiyao Date: Thu, 13 Aug 2020 19:14:00 +0800 Subject: [PATCH 1/4] fix:return error when calling ``InsertOrUpdate`` is successful with string primary key --- pkg/orm/db.go | 9 +++++++-- pkg/orm/db_mysql.go | 7 ++++++- pkg/orm/orm_test.go | 20 +++++++++++++++++--- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/pkg/orm/db.go b/pkg/orm/db.go index dc4b5a3f..dea8845f 100644 --- a/pkg/orm/db.go +++ b/pkg/orm/db.go @@ -486,7 +486,7 @@ func (d *dbBase) InsertValue(q dbQuerier, mi *modelInfo, isMulti bool, names []s return res.RowsAffected() } - lastInsertId, err:=res.LastInsertId() + lastInsertId, err := res.LastInsertId() if err != nil { DebugLog.Println("[WARN] return LastInsertId error:", err) } @@ -591,7 +591,12 @@ func (d *dbBase) InsertOrUpdate(q dbQuerier, mi *modelInfo, ind reflect.Value, a if isMulti { return res.RowsAffected() } - return res.LastInsertId() + + lastInsertId, err := res.LastInsertId() + if err != nil { + DebugLog.Println("[WARN] return LastInsertId error:", err) + } + return lastInsertId, nil } return 0, err } diff --git a/pkg/orm/db_mysql.go b/pkg/orm/db_mysql.go index 6e99058e..0db26e5b 100644 --- a/pkg/orm/db_mysql.go +++ b/pkg/orm/db_mysql.go @@ -164,7 +164,12 @@ func (d *dbBaseMysql) InsertOrUpdate(q dbQuerier, mi *modelInfo, ind reflect.Val if isMulti { return res.RowsAffected() } - return res.LastInsertId() + + lastInsertId, err := res.LastInsertId() + if err != nil { + DebugLog.Println("[WARN] return LastInsertId error:", err) + } + return lastInsertId, nil } return 0, err } diff --git a/pkg/orm/orm_test.go b/pkg/orm/orm_test.go index fd752a94..d4a47686 100644 --- a/pkg/orm/orm_test.go +++ b/pkg/orm/orm_test.go @@ -2528,19 +2528,33 @@ func TestInsertOrUpdate(t *testing.T) { func TestStrPkInsert(t *testing.T) { RegisterModel(new(StrPk)) + pk := `1` value := `StrPkValues(*56` strPk := &StrPk{ - Id: "1", + Id: pk, Value: value, } var err error _, err = dORM.Insert(strPk) throwFailNow(t, AssertIs(err, nil)) - + var vForTesting StrPk - err = dORM.QueryTable(new(StrPk)).Filter(`id`, `1`).One(&vForTesting) + err = dORM.QueryTable(new(StrPk)).Filter(`id`, pk).One(&vForTesting) throwFailNow(t, AssertIs(err, nil)) throwFailNow(t, AssertIs(vForTesting.Value, value)) + + value2 := `s8s5da7as` + strPkForUpsert := &StrPk{ + Id: pk, + Value: value2, + } + _, err = dORM.InsertOrUpdate(strPkForUpsert, `id`) + throwFailNow(t, AssertIs(err, nil)) + + var vForTesting2 StrPk + err = dORM.QueryTable(new(StrPk)).Filter(`id`, pk).One(&vForTesting2) + throwFailNow(t, AssertIs(err, nil)) + throwFailNow(t, AssertIs(vForTesting2.Value, value2)) } From 139c393f08b0c69b1aa6cf5ef932c5f05f2b56b3 Mon Sep 17 00:00:00 2001 From: jianzhiyao Date: Fri, 14 Aug 2020 09:59:11 +0800 Subject: [PATCH 2/4] add const ErrLastInsertIdUnavailable --- pkg/orm/db.go | 4 ++-- pkg/orm/db_mysql.go | 2 +- pkg/orm/db_oracle.go | 2 +- pkg/orm/orm.go | 2 ++ 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pkg/orm/db.go b/pkg/orm/db.go index dea8845f..2477b132 100644 --- a/pkg/orm/db.go +++ b/pkg/orm/db.go @@ -488,7 +488,7 @@ func (d *dbBase) InsertValue(q dbQuerier, mi *modelInfo, isMulti bool, names []s lastInsertId, err := res.LastInsertId() if err != nil { - DebugLog.Println("[WARN] return LastInsertId error:", err) + DebugLog.Println(ErrLastInsertIdUnavailable, ':', err) } return lastInsertId, nil } @@ -594,7 +594,7 @@ func (d *dbBase) InsertOrUpdate(q dbQuerier, mi *modelInfo, ind reflect.Value, a lastInsertId, err := res.LastInsertId() if err != nil { - DebugLog.Println("[WARN] return LastInsertId error:", err) + DebugLog.Println(ErrLastInsertIdUnavailable, ':', err) } return lastInsertId, nil } diff --git a/pkg/orm/db_mysql.go b/pkg/orm/db_mysql.go index 0db26e5b..11665fb2 100644 --- a/pkg/orm/db_mysql.go +++ b/pkg/orm/db_mysql.go @@ -167,7 +167,7 @@ func (d *dbBaseMysql) InsertOrUpdate(q dbQuerier, mi *modelInfo, ind reflect.Val lastInsertId, err := res.LastInsertId() if err != nil { - DebugLog.Println("[WARN] return LastInsertId error:", err) + DebugLog.Println(ErrLastInsertIdUnavailable, ':', err) } return lastInsertId, nil } diff --git a/pkg/orm/db_oracle.go b/pkg/orm/db_oracle.go index 91a30f81..5177fb89 100644 --- a/pkg/orm/db_oracle.go +++ b/pkg/orm/db_oracle.go @@ -153,7 +153,7 @@ func (d *dbBaseOracle) InsertValue(q dbQuerier, mi *modelInfo, isMulti bool, nam lastInsertId, err := res.LastInsertId() if err != nil { - DebugLog.Println("[WARN] return LastInsertId error:", err) + DebugLog.Println(ErrLastInsertIdUnavailable, ':', err) } return lastInsertId, nil } diff --git a/pkg/orm/orm.go b/pkg/orm/orm.go index 895636b6..5d81c764 100644 --- a/pkg/orm/orm.go +++ b/pkg/orm/orm.go @@ -85,6 +85,8 @@ var ( ErrStmtClosed = errors.New(" stmt already closed") ErrArgs = errors.New(" args error may be empty") ErrNotImplement = errors.New("have not implement") + + ErrLastInsertIdUnavailable = errors.New(" last insert id is unavailable") ) // Params stores the Params From 739b8bab0c0cbeef3f7ef23300eee506fd3f26f2 Mon Sep 17 00:00:00 2001 From: jianzhiyao Date: Fri, 14 Aug 2020 10:31:08 +0800 Subject: [PATCH 3/4] fix UT --- pkg/orm/orm_test.go | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/pkg/orm/orm_test.go b/pkg/orm/orm_test.go index d4a47686..0d4451cd 100644 --- a/pkg/orm/orm_test.go +++ b/pkg/orm/orm_test.go @@ -2538,7 +2538,7 @@ func TestStrPkInsert(t *testing.T) { var err error _, err = dORM.Insert(strPk) throwFailNow(t, AssertIs(err, nil)) - + var vForTesting StrPk err = dORM.QueryTable(new(StrPk)).Filter(`id`, pk).One(&vForTesting) throwFailNow(t, AssertIs(err, nil)) @@ -2549,12 +2549,19 @@ func TestStrPkInsert(t *testing.T) { Id: pk, Value: value2, } + _, err = dORM.InsertOrUpdate(strPkForUpsert, `id`) - throwFailNow(t, AssertIs(err, nil)) - - var vForTesting2 StrPk - err = dORM.QueryTable(new(StrPk)).Filter(`id`, pk).One(&vForTesting2) - throwFailNow(t, AssertIs(err, nil)) - throwFailNow(t, AssertIs(vForTesting2.Value, value2)) + if err != nil { + fmt.Println(err) + if err.Error() == "postgres version must 9.5 or higher" || err.Error() == "`sqlite3` nonsupport InsertOrUpdate in beego" { + } else { + throwFailNow(t, err) + } + } else { + var vForTesting2 StrPk + err = dORM.QueryTable(new(StrPk)).Filter(`id`, pk).One(&vForTesting2) + throwFailNow(t, AssertIs(err, nil)) + throwFailNow(t, AssertIs(vForTesting2.Value, value2)) + } } From 7b899aa9af47abe594a8bee1aa0db625310c2022 Mon Sep 17 00:00:00 2001 From: jianzhiyao Date: Fri, 14 Aug 2020 15:09:47 +0800 Subject: [PATCH 4/4] add ErrLastInsertIdUnavailable --- pkg/orm/db.go | 8 ++++++-- pkg/orm/db_mysql.go | 4 +++- pkg/orm/db_oracle.go | 4 +++- pkg/orm/orm_test.go | 5 ++++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/pkg/orm/db.go b/pkg/orm/db.go index 2477b132..0b6d8ac1 100644 --- a/pkg/orm/db.go +++ b/pkg/orm/db.go @@ -489,8 +489,10 @@ func (d *dbBase) InsertValue(q dbQuerier, mi *modelInfo, isMulti bool, names []s lastInsertId, err := res.LastInsertId() if err != nil { DebugLog.Println(ErrLastInsertIdUnavailable, ':', err) + return lastInsertId, ErrLastInsertIdUnavailable + }else{ + return lastInsertId, nil } - return lastInsertId, nil } return 0, err } @@ -595,8 +597,10 @@ func (d *dbBase) InsertOrUpdate(q dbQuerier, mi *modelInfo, ind reflect.Value, a lastInsertId, err := res.LastInsertId() if err != nil { DebugLog.Println(ErrLastInsertIdUnavailable, ':', err) + return lastInsertId, ErrLastInsertIdUnavailable + }else{ + return lastInsertId, nil } - return lastInsertId, nil } return 0, err } diff --git a/pkg/orm/db_mysql.go b/pkg/orm/db_mysql.go index 11665fb2..efa5a50b 100644 --- a/pkg/orm/db_mysql.go +++ b/pkg/orm/db_mysql.go @@ -168,8 +168,10 @@ func (d *dbBaseMysql) InsertOrUpdate(q dbQuerier, mi *modelInfo, ind reflect.Val lastInsertId, err := res.LastInsertId() if err != nil { DebugLog.Println(ErrLastInsertIdUnavailable, ':', err) + return lastInsertId, ErrLastInsertIdUnavailable + }else{ + return lastInsertId, nil } - return lastInsertId, nil } return 0, err } diff --git a/pkg/orm/db_oracle.go b/pkg/orm/db_oracle.go index 5177fb89..d384d33e 100644 --- a/pkg/orm/db_oracle.go +++ b/pkg/orm/db_oracle.go @@ -154,8 +154,10 @@ func (d *dbBaseOracle) InsertValue(q dbQuerier, mi *modelInfo, isMulti bool, nam lastInsertId, err := res.LastInsertId() if err != nil { DebugLog.Println(ErrLastInsertIdUnavailable, ':', err) + return lastInsertId, ErrLastInsertIdUnavailable + }else{ + return lastInsertId, nil } - return lastInsertId, nil } return 0, err } diff --git a/pkg/orm/orm_test.go b/pkg/orm/orm_test.go index 0d4451cd..c759309e 100644 --- a/pkg/orm/orm_test.go +++ b/pkg/orm/orm_test.go @@ -2537,7 +2537,9 @@ func TestStrPkInsert(t *testing.T) { var err error _, err = dORM.Insert(strPk) - throwFailNow(t, AssertIs(err, nil)) + if err != ErrLastInsertIdUnavailable { + throwFailNow(t, AssertIs(err, nil)) + } var vForTesting StrPk err = dORM.QueryTable(new(StrPk)).Filter(`id`, pk).One(&vForTesting) @@ -2554,6 +2556,7 @@ func TestStrPkInsert(t *testing.T) { if err != nil { fmt.Println(err) if err.Error() == "postgres version must 9.5 or higher" || err.Error() == "`sqlite3` nonsupport InsertOrUpdate in beego" { + } else if err == ErrLastInsertIdUnavailable { } else { throwFailNow(t, err) }