diff --git a/pkg/orm/db.go b/pkg/orm/db.go index dc4b5a3f..0b6d8ac1 100644 --- a/pkg/orm/db.go +++ b/pkg/orm/db.go @@ -486,11 +486,13 @@ 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) + DebugLog.Println(ErrLastInsertIdUnavailable, ':', err) + return lastInsertId, ErrLastInsertIdUnavailable + }else{ + return lastInsertId, nil } - return lastInsertId, nil } return 0, err } @@ -591,7 +593,14 @@ 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(ErrLastInsertIdUnavailable, ':', err) + return lastInsertId, ErrLastInsertIdUnavailable + }else{ + return lastInsertId, nil + } } return 0, err } diff --git a/pkg/orm/db_mysql.go b/pkg/orm/db_mysql.go index 6e99058e..efa5a50b 100644 --- a/pkg/orm/db_mysql.go +++ b/pkg/orm/db_mysql.go @@ -164,7 +164,14 @@ 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(ErrLastInsertIdUnavailable, ':', err) + return lastInsertId, ErrLastInsertIdUnavailable + }else{ + return lastInsertId, nil + } } return 0, err } diff --git a/pkg/orm/db_oracle.go b/pkg/orm/db_oracle.go index 91a30f81..d384d33e 100644 --- a/pkg/orm/db_oracle.go +++ b/pkg/orm/db_oracle.go @@ -153,9 +153,11 @@ 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, ErrLastInsertIdUnavailable + }else{ + return lastInsertId, nil } - return lastInsertId, nil } return 0, err } 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 diff --git a/pkg/orm/orm_test.go b/pkg/orm/orm_test.go index 6e65ad7a..7cbce13d 100644 --- a/pkg/orm/orm_test.go +++ b/pkg/orm/orm_test.go @@ -2542,18 +2542,42 @@ 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)) + if err != ErrLastInsertIdUnavailable { + 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`) + 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) + } + } 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)) + } }