From b03c5d5372c4adad876424775bddfe6ebc38a96d Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 14 Mar 2019 22:33:48 +0800 Subject: [PATCH] fix tests --- session_exist_test.go | 2 +- session_find_test.go | 39 +++++----- session_get_test.go | 41 +++++------ session_insert_test.go | 28 ++++--- session_query_test.go | 30 ++++---- session_raw_test.go | 4 +- session_stats_test.go | 6 +- session_tx_test.go | 7 +- session_update.go | 3 + session_update_test.go | 35 +++++---- statement.go | 37 +++++----- statement_test.go | 9 ++- tag_test.go | 6 +- time_test.go | 12 ++- types_null_test.go | 161 ++++++++++++----------------------------- 15 files changed, 186 insertions(+), 234 deletions(-) diff --git a/session_exist_test.go b/session_exist_test.go index c5318677..6bbd6a73 100644 --- a/session_exist_test.go +++ b/session_exist_test.go @@ -56,7 +56,7 @@ func TestExistStruct(t *testing.T) { assert.NoError(t, err) assert.False(t, has) - tableName := tableMapper.Obj2Table("RecordExist") + tableName := "`" + tableMapper.Obj2Table("RecordExist") + "`" has, err = testEngine.SQL("select * from "+testEngine.TableName(tableName, true)+" where "+nameName+" = ?", "test1").Exist() assert.NoError(t, err) diff --git a/session_find_test.go b/session_find_test.go index 8b0f7b60..776183bf 100644 --- a/session_find_test.go +++ b/session_find_test.go @@ -52,13 +52,13 @@ func TestJoinLimit(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - tableName := tableMapper.Obj2Table("CheckList") - tableName2 := tableMapper.Obj2Table("Salary") - tableName3 := tableMapper.Obj2Table("Empsetting") + tableName := "`" + tableMapper.Obj2Table("CheckList") + "`" + tableName2 := "`" + tableMapper.Obj2Table("Salary") + "`" + tableName3 := "`" + tableMapper.Obj2Table("Empsetting") + "`" - idName := colMapper.Obj2Table("Id") - lIDName := colMapper.Obj2Table("Lid") - eIDName := colMapper.Obj2Table("Eid") + idName := "`" + colMapper.Obj2Table("Id") + "`" + lIDName := "`" + colMapper.Obj2Table("Lid") + "`" + eIDName := "`" + colMapper.Obj2Table("Eid") + "`" var salaries []Salary err = testEngine.Table(tableName2). @@ -286,11 +286,11 @@ func TestGroupBy(t *testing.T) { assert.NoError(t, prepareEngine()) assertSync(t, new(Userinfo)) - idName := "id" + idName := "`id`" userName := colMapper.Obj2Table("Username") users := make([]Userinfo, 0) - err := testEngine.GroupBy(idName + ", " + userName).Find(&users) + err := testEngine.GroupBy(idName + ", `" + userName + "`").Find(&users) assert.NoError(t, err) } @@ -609,17 +609,20 @@ func TestFindMapStringId(t *testing.T) { deviceIDs := []string{"1"} + deviceIDName := "`" + colMapper.Obj2Table("Deviceid") + "`" + statusName := "`" + colMapper.Obj2Table("Status") + "`" + deviceMaps := make(map[string]*FindMapDevice, len(deviceIDs)) err = testEngine. - Where("status = ?", 1). - In("deviceid", deviceIDs). + Where(statusName+" = ?", 1). + In(deviceIDName, deviceIDs). Find(&deviceMaps) assert.NoError(t, err) deviceMaps2 := make(map[string]FindMapDevice, len(deviceIDs)) err = testEngine. - Where("status = ?", 1). - In("deviceid", deviceIDs). + Where(statusName+" = ?", 1). + In(deviceIDName, deviceIDs). Find(&deviceMaps2) assert.NoError(t, err) @@ -650,7 +653,7 @@ func TestFindMapStringId(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - sum, err := testEngine.SumInt(new(FindMapDevice), "status") + sum, err := testEngine.SumInt(new(FindMapDevice), statusName) assert.NoError(t, err) assert.EqualValues(t, 2, sum) @@ -783,12 +786,12 @@ func TestFindJoin(t *testing.T) { assert.NoError(t, prepareEngine()) assertSync(t, new(SceneItem), new(DeviceUserPrivrels)) - tableName1 := tableMapper.Obj2Table("SceneItem") - tableName2 := tableMapper.Obj2Table("DeviceUserPrivrels") + tableName1 := "`" + tableMapper.Obj2Table("SceneItem") + "`" + tableName2 := "`" + tableMapper.Obj2Table("DeviceUserPrivrels") + "`" - deviceIDName := colMapper.Obj2Table("DeviceId") - userIDName := colMapper.Obj2Table("UserId") - typeName := colMapper.Obj2Table("Type") + deviceIDName := "`" + colMapper.Obj2Table("DeviceId") + "`" + userIDName := "`" + colMapper.Obj2Table("UserId") + "`" + typeName := "`" + colMapper.Obj2Table("Type") + "`" var scenes []SceneItem err := testEngine.Join("LEFT OUTER", tableName2, tableName1+"."+deviceIDName+"="+tableName2+"."+deviceIDName). diff --git a/session_get_test.go b/session_get_test.go index 585f5327..24bfbf94 100644 --- a/session_get_test.go +++ b/session_get_test.go @@ -35,16 +35,20 @@ func TestGetVar(t *testing.T) { _, err := testEngine.InsertOne(&data) assert.NoError(t, err) - tableName := tableMapper.Obj2Table("GetVar") + tableName := "`" + tableMapper.Obj2Table("GetVar") + "`" + idName := colMapper.Obj2Table("Id") + msgName := colMapper.Obj2Table("Msg") + ageName := colMapper.Obj2Table("Age") + moneyName := colMapper.Obj2Table("Money") var msg string - has, err := testEngine.Table(tableName).Cols("msg").Get(&msg) + has, err := testEngine.Table(tableName).Cols("`" + msgName + "`").Get(&msg) assert.NoError(t, err) assert.Equal(t, true, has) assert.Equal(t, "hi", msg) var age int - has, err = testEngine.Table(tableName).Cols("age").Get(&age) + has, err = testEngine.Table(tableName).Cols("`" + ageName + "`").Get(&age) assert.NoError(t, err) assert.Equal(t, true, has) assert.Equal(t, 28, age) @@ -56,9 +60,9 @@ func TestGetVar(t *testing.T) { assert.Equal(t, 28, ageMax) var age2 int64 - has, err = testEngine.Table(tableName).Cols("age"). - Where("age > ?", 20). - And("age < ?", 30). + has, err = testEngine.Table(tableName).Cols("`"+ageName+"`"). + Where("`"+ageName+"` > ?", 20). + And("`"+ageName+"` < ?", 30). Get(&age2) assert.NoError(t, err) assert.Equal(t, true, has) @@ -128,52 +132,47 @@ func TestGetVar(t *testing.T) { assert.EqualValues(t, 28, age10) var id sql.NullInt64 - has, err = testEngine.Table(tableName).Cols("id").Get(&id) + has, err = testEngine.Table(tableName).Cols("`" + idName + "`").Get(&id) assert.NoError(t, err) assert.Equal(t, true, has) assert.Equal(t, true, id.Valid) assert.EqualValues(t, data.Id, id.Int64) var msgNull sql.NullString - has, err = testEngine.Table(tableName).Cols("msg").Get(&msgNull) + has, err = testEngine.Table(tableName).Cols("`" + msgName + "`").Get(&msgNull) assert.NoError(t, err) assert.Equal(t, true, has) assert.Equal(t, true, msgNull.Valid) assert.EqualValues(t, data.Msg, msgNull.String) var nullMoney sql.NullFloat64 - has, err = testEngine.Table(tableName).Cols("money").Get(&nullMoney) + has, err = testEngine.Table(tableName).Cols("`" + moneyName + "`").Get(&nullMoney) assert.NoError(t, err) assert.Equal(t, true, has) assert.Equal(t, true, nullMoney.Valid) assert.EqualValues(t, data.Money, nullMoney.Float64) var money float64 - has, err = testEngine.Table(tableName).Cols("money").Get(&money) + has, err = testEngine.Table(tableName).Cols("`" + moneyName + "`").Get(&money) assert.NoError(t, err) assert.Equal(t, true, has) assert.Equal(t, "1.5", fmt.Sprintf("%.1f", money)) var money2 float64 if testEngine.Dialect().DBType() == core.MSSQL { - has, err = testEngine.SQL("SELECT TOP 1 money FROM " + testEngine.TableName(tableName, true)).Get(&money2) + has, err = testEngine.SQL("SELECT TOP 1 `" + moneyName + "` FROM " + testEngine.TableName(tableName, true)).Get(&money2) } else { - has, err = testEngine.SQL("SELECT money FROM " + testEngine.TableName(tableName, true) + " LIMIT 1").Get(&money2) + has, err = testEngine.SQL("SELECT `" + moneyName + "` FROM " + testEngine.TableName(tableName, true) + " LIMIT 1").Get(&money2) } assert.NoError(t, err) assert.Equal(t, true, has) assert.Equal(t, "1.5", fmt.Sprintf("%.1f", money2)) var money3 float64 - has, err = testEngine.SQL("SELECT money FROM " + testEngine.TableName(tableName, true) + " WHERE money > 20").Get(&money3) + has, err = testEngine.SQL("SELECT `" + moneyName + "` FROM " + testEngine.TableName(tableName, true) + " WHERE `" + moneyName + "` > 20").Get(&money3) assert.NoError(t, err) assert.Equal(t, false, has) - idName := colMapper.Obj2Table("Id") - ageName := colMapper.Obj2Table("Age") - msgName := colMapper.Obj2Table("Msg") - moneyName := colMapper.Obj2Table("Money") - var valuesString = make(map[string]string) has, err = testEngine.Table(tableName).Get(&valuesString) assert.NoError(t, err) @@ -187,7 +186,7 @@ func TestGetVar(t *testing.T) { // for mymysql driver, interface{} will be []byte, so ignore it currently if testEngine.Dialect().DriverName() != "mymysql" { var valuesInter = make(map[string]interface{}) - has, err = testEngine.Table(tableName).Where(idName+" = ?", 1).Select("*").Get(&valuesInter) + has, err = testEngine.Table(tableName).Where("`"+idName+"` = ?", 1).Select("*").Get(&valuesInter) assert.NoError(t, err) assert.Equal(t, true, has) assert.Equal(t, 5, len(valuesInter)) @@ -405,10 +404,10 @@ func TestGetStructId(t *testing.T) { Id int64 } - idName := colMapper.Obj2Table("Id") + idName := "`" + colMapper.Obj2Table("Id") + "`" //var id int64 var maxid maxidst - sql := "select max(" + idName + ") as id from " + testEngine.TableName(&TestGetStruct{}, true) + sql := "select max(" + idName + ") as id from " + testEngine.Quote(testEngine.TableName(&TestGetStruct{}, true)) has, err := testEngine.SQL(sql).Get(&maxid) assert.NoError(t, err) assert.True(t, has) diff --git a/session_insert_test.go b/session_insert_test.go index 5a33d830..5b7dd43b 100644 --- a/session_insert_test.go +++ b/session_insert_test.go @@ -753,10 +753,14 @@ func TestInsertMap(t *testing.T) { assert.NoError(t, prepareEngine()) assertSync(t, new(InsertMap)) + widthName := colMapper.Obj2Table("Width") + heightName := colMapper.Obj2Table("Height") + nameName := colMapper.Obj2Table("Name") + cnt, err := testEngine.Table(new(InsertMap)).Insert(map[string]interface{}{ - "width": 20, - "height": 10, - "name": "lunny", + widthName: 20, + heightName: 10, + nameName: "lunny", }) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -772,9 +776,9 @@ func TestInsertMap(t *testing.T) { tableName := tableMapper.Obj2Table("InsertMap") cnt, err = testEngine.Table(tableName).Insert(map[string]interface{}{ - "width": 30, - "height": 10, - "name": "lunny", + widthName: 30, + heightName: 10, + nameName: "lunny", }) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -792,14 +796,14 @@ func TestInsertMap(t *testing.T) { cnt, err = testEngine.Table(tableName).Insert([]map[string]interface{}{ { - "width": 40, - "height": 10, - "name": "lunny", + widthName: 40, + heightName: 10, + nameName: "lunny", }, { - "width": 50, - "height": 10, - "name": "lunny", + widthName: 50, + heightName: 10, + nameName: "lunny", }, }) assert.NoError(t, err) diff --git a/session_query_test.go b/session_query_test.go index d3e5fc16..c41f06dc 100644 --- a/session_query_test.go +++ b/session_query_test.go @@ -39,7 +39,7 @@ func TestQueryString(t *testing.T) { tableName := tableMapper.Obj2Table("GetVar2") - records, err := testEngine.QueryString("select * from " + testEngine.TableName(tableName, true)) + records, err := testEngine.QueryString("select * from `" + testEngine.TableName(tableName, true) + "`") assert.NoError(t, err) assert.Equal(t, 1, len(records)) assert.Equal(t, 5, len(records[0])) @@ -71,7 +71,7 @@ func TestQueryString2(t *testing.T) { _, err := testEngine.Insert(data) assert.NoError(t, err) - tableName := tableMapper.Obj2Table("GetVar3") + tableName := "`" + tableMapper.Obj2Table("GetVar3") + "`" idName := colMapper.Obj2Table("Id") msgName := colMapper.Obj2Table("Msg") @@ -141,7 +141,7 @@ func TestQueryInterface(t *testing.T) { _, err := testEngine.InsertOne(data) assert.NoError(t, err) - tableName := tableMapper.Obj2Table("GetVarInterface") + tableName := "`" + tableMapper.Obj2Table("GetVarInterface") + "`" idName := colMapper.Obj2Table("Id") msgName := colMapper.Obj2Table("Msg") ageName := colMapper.Obj2Table("Age") @@ -202,7 +202,7 @@ func TestQueryNoParams(t *testing.T) { assert.EqualValues(t, 3000, money) } - tableName := tableMapper.Obj2Table("QueryNoParams") + tableName := "`" + tableMapper.Obj2Table("QueryNoParams") + "`" results, err := testEngine.Table(tableName).Limit(10).Query() assert.NoError(t, err) assertResult(t, results) @@ -228,7 +228,7 @@ func TestQueryStringNoParam(t *testing.T) { _, err := testEngine.Insert(data) assert.NoError(t, err) - tableName := tableMapper.Obj2Table("GetVar4") + tableName := "`" + tableMapper.Obj2Table("GetVar4") + "`" idName := colMapper.Obj2Table("Id") msgName := colMapper.Obj2Table("Msg") @@ -243,7 +243,7 @@ func TestQueryStringNoParam(t *testing.T) { assert.EqualValues(t, "0", records[0][msgName]) } - records, err = testEngine.Table(tableName).Where(builder.Eq{idName: 1}).QueryString() + records, err = testEngine.Table(tableName).Where(builder.Eq{"`" + idName + "`": 1}).QueryString() assert.NoError(t, err) assert.EqualValues(t, 1, len(records)) assert.EqualValues(t, "1", records[0][idName]) @@ -270,7 +270,7 @@ func TestQuerySliceStringNoParam(t *testing.T) { _, err := testEngine.Insert(data) assert.NoError(t, err) - tableName := tableMapper.Obj2Table("GetVar6") + tableName := "`" + tableMapper.Obj2Table("GetVar6") + "`" records, err := testEngine.Table(tableName).Limit(1).QuerySliceString() assert.NoError(t, err) @@ -283,7 +283,7 @@ func TestQuerySliceStringNoParam(t *testing.T) { } idName := colMapper.Obj2Table("Id") - records, err = testEngine.Table(tableName).Where(builder.Eq{idName: 1}).QuerySliceString() + records, err = testEngine.Table(tableName).Where(builder.Eq{"`" + idName + "`": 1}).QuerySliceString() assert.NoError(t, err) assert.EqualValues(t, 1, len(records)) assert.EqualValues(t, "1", records[0][0]) @@ -310,7 +310,7 @@ func TestQueryInterfaceNoParam(t *testing.T) { _, err := testEngine.Insert(data) assert.NoError(t, err) - tableName := tableMapper.Obj2Table("GetVar5") + tableName := "`" + tableMapper.Obj2Table("GetVar5") + "`" idName := colMapper.Obj2Table("Id") msgName := colMapper.Obj2Table("Msg") @@ -320,7 +320,7 @@ func TestQueryInterfaceNoParam(t *testing.T) { assert.EqualValues(t, 1, toInt64(records[0][idName])) assert.EqualValues(t, 0, toInt64(records[0][msgName])) - records, err = testEngine.Table(tableName).Where(builder.Eq{idName: 1}).QueryInterface() + records, err = testEngine.Table(tableName).Where(builder.Eq{"`" + idName + "`": 1}).QueryInterface() assert.NoError(t, err) assert.EqualValues(t, 1, len(records)) assert.EqualValues(t, 1, toInt64(records[0][idName])) @@ -373,7 +373,7 @@ func TestQueryWithBuilder(t *testing.T) { } tableName := tableMapper.Obj2Table("QueryWithBuilder") - results, err := testEngine.Query(builder.Select("*").From(testEngine.TableName(tableName, true))) + results, err := testEngine.Query(builder.Select("*").From("`" + testEngine.TableName(tableName, true) + "`")) assert.NoError(t, err) assertResult(t, results) } @@ -414,11 +414,11 @@ func TestJoinWithSubQuery(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - tableName := tableMapper.Obj2Table("JoinWithSubQueryDepart") - tableName1 := tableMapper.Obj2Table("JoinWithSubQuery1") + tableName := "`" + tableMapper.Obj2Table("JoinWithSubQueryDepart") + "`" + tableName1 := "`" + tableMapper.Obj2Table("JoinWithSubQuery1") + "`" - departID := colMapper.Obj2Table("DepartId") - idName := colMapper.Obj2Table("Id") + departID := "`" + colMapper.Obj2Table("DepartId") + "`" + idName := "`" + colMapper.Obj2Table("Id") + "`" var querys []JoinWithSubQuery1 err = testEngine.Join("INNER", builder.Select(idName).From(testEngine.Quote(testEngine.TableName(tableName, true))), diff --git a/session_raw_test.go b/session_raw_test.go index 10d8ec07..279e7ecc 100644 --- a/session_raw_test.go +++ b/session_raw_test.go @@ -25,13 +25,13 @@ func TestExecAndQuery(t *testing.T) { uidName := colMapper.Obj2Table("Uid") nameName := colMapper.Obj2Table("Name") - res, err := testEngine.Exec("INSERT INTO "+testEngine.TableName(tableName, true)+" ("+uidName+", "+nameName+") VALUES (?, ?)", 1, "user") + res, err := testEngine.Exec("INSERT INTO `"+testEngine.TableName(tableName, true)+"` (`"+uidName+"`, `"+nameName+"`) VALUES (?, ?)", 1, "user") assert.NoError(t, err) cnt, err := res.RowsAffected() assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - results, err := testEngine.Query("select * from " + testEngine.TableName(tableName, true)) + results, err := testEngine.Query("select * from `" + testEngine.TableName(tableName, true) + "`") assert.NoError(t, err) assert.EqualValues(t, 1, len(results)) id, err := strconv.Atoi(string(results[0][uidName])) diff --git a/session_stats_test.go b/session_stats_test.go index 35a9e408..f608f3aa 100644 --- a/session_stats_test.go +++ b/session_stats_test.go @@ -153,8 +153,9 @@ func TestSumCustomColumn(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 3, cnt) + intName := colMapper.Obj2Table("Int") sumInt, err := testEngine.Sum(new(SumStruct2), - "CASE WHEN `int` <= 2 THEN `int` ELSE 0 END") + "CASE WHEN `"+intName+"` <= 2 THEN `"+intName+"` ELSE 0 END") assert.NoError(t, err) assert.EqualValues(t, 3, int(sumInt)) } @@ -214,8 +215,7 @@ func TestSQLCount(t *testing.T) { tableName := tableMapper.Obj2Table("UserinfoCount2") idName := colMapper.Obj2Table("Id") - total, err := testEngine.SQL("SELECT count(" + idName + ") FROM " + testEngine.TableName(tableName, true)). - Count() + total, err := testEngine.SQL("SELECT count(`" + idName + "`) FROM `" + testEngine.TableName(tableName, true) + "`").Count() assert.NoError(t, err) assert.EqualValues(t, 0, total) } diff --git a/session_tx_test.go b/session_tx_test.go index ac126169..2e63cc30 100644 --- a/session_tx_test.go +++ b/session_tx_test.go @@ -79,7 +79,7 @@ func TestCombineTransaction(t *testing.T) { _, err = session.Where("id = ?", 0).Update(&user2) assert.NoError(t, err) - _, err = session.Exec("delete from "+testEngine.TableName(tableName, true)+" where "+userName+" = ?", user2.Username) + _, err = session.Exec("delete from `"+testEngine.TableName(tableName, true)+"` where `"+userName+"` = ?", user2.Username) assert.NoError(t, err) err = session.Commit() @@ -107,7 +107,8 @@ func TestMultipleTransaction(t *testing.T) { assert.NoError(t, err) user2 := MultipleTransaction{Name: "zzz"} - _, err = session.Where("id = ?", 0).Update(&user2) + idName := colMapper.Obj2Table("Id") + _, err = session.Where("`"+idName+"` = ?", 0).Update(&user2) assert.NoError(t, err) err = session.Commit() @@ -121,7 +122,7 @@ func TestMultipleTransaction(t *testing.T) { err = session.Begin() assert.NoError(t, err) - _, err = session.Where("id=?", m1.Id).Delete(new(MultipleTransaction)) + _, err = session.Where("`"+idName+"`=?", m1.Id).Delete(new(MultipleTransaction)) assert.NoError(t, err) err = session.Commit() diff --git a/session_update.go b/session_update.go index 18425ec3..e6c8d359 100644 --- a/session_update.go +++ b/session_update.go @@ -183,6 +183,9 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 if session.statement.ColumnStr == "" { colNames, args = session.statement.buildUpdates(bean, false, false, false, false, true) + if session.statement.lastError != nil { + return 0, err + } } else { colNames, args, err = session.genUpdateColumns(bean) if err != nil { diff --git a/session_update_test.go b/session_update_test.go index 969192fc..6862fb49 100644 --- a/session_update_test.go +++ b/session_update_test.go @@ -34,8 +34,9 @@ func TestUpdateMap(t *testing.T) { tableName := tableMapper.Obj2Table("UpdateTable") nameName := colMapper.Obj2Table("Name") ageName := colMapper.Obj2Table("age") + idName := colMapper.Obj2Table("Id") - cnt, err := testEngine.Table(tableName).Where("id = ?", tb.Id).Update(map[string]interface{}{ + cnt, err := testEngine.Table(tableName).Where("`"+idName+"` = ?", tb.Id).Update(map[string]interface{}{ nameName: "test2", ageName: 36, }) @@ -67,7 +68,7 @@ func TestUpdateLimit(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - nameName := colMapper.Obj2Table("Name") + nameName := "`" + colMapper.Obj2Table("Name") + "`" cnt, err = testEngine.OrderBy(nameName + " desc").Limit(1).Update(&UpdateTable2{ Age: 30, @@ -274,8 +275,8 @@ func TestUpdateMap2(t *testing.T) { assertSync(t, new(UpdateMustCols)) tableName := tableMapper.Obj2Table("UpdateMustCols") - _, err := testEngine.Table(tableName).Where("id =?", 1).Update(map[string]interface{}{ - "bool": true, + _, err := testEngine.Table(tableName).Where("`"+colMapper.Obj2Table("Id")+"` =?", 1).Update(map[string]interface{}{ + colMapper.Obj2Table("Bool"): true, }) assert.NoError(t, err) } @@ -299,7 +300,14 @@ func TestUpdate1(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - condi := Condi{"username": "zzz", "departname": ""} + userName := "`" + colMapper.Obj2Table("Username") + "`" + heightName := "`" + colMapper.Obj2Table("Height") + "`" + departName := "`" + colMapper.Obj2Table("Departname") + "`" + detailIDName := "`detail_id`" + isMan := "`" + colMapper.Obj2Table("IsMan") + "`" + createdName := "`" + colMapper.Obj2Table("Created") + "`" + + condi := Condi{userName: "zzz", departName: ""} cnt, err = testEngine.Table(&user).ID(ori.Uid).Update(&condi) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -311,13 +319,6 @@ func TestUpdate1(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, cnt, total) - userName := colMapper.Obj2Table("Username") - heightName := colMapper.Obj2Table("Height") - departName := colMapper.Obj2Table("Departname") - detailIDName := "detail_id" - isMan := colMapper.Obj2Table("IsMan") - createdName := colMapper.Obj2Table("Created") - // nullable update { user := &Userinfo{Username: "not null data", Height: 180.5} @@ -757,7 +758,9 @@ func TestNewUpdate(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 0, af) - af, err = testEngine.Table(new(TbUserInfo)).Where("phone=?", 13126564922).Update(&changeUsr) + phoneName := "`" + colMapper.Obj2Table("Phone") + "`" + + af, err = testEngine.Table(new(TbUserInfo)).Where(phoneName+"=?", 13126564922).Update(&changeUsr) assert.NoError(t, err) assert.EqualValues(t, 0, af) } @@ -888,7 +891,7 @@ func TestUpdateMapCondition(t *testing.T) { _, err := testEngine.Insert(&c) assert.NoError(t, err) - idName := colMapper.Obj2Table("Id") + idName := "`" + colMapper.Obj2Table("Id") + "`" cnt, err := testEngine.Update(&UpdateMapCondition{ String: "string1", @@ -1075,8 +1078,10 @@ func TestUpdateDeleted(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 0, cnt) + nameName := colMapper.Obj2Table("Name") + cnt, err = testEngine.Table(&UpdateDeletedStruct{}).ID(s.Id).Update(map[string]interface{}{ - "name": "test1", + nameName: "test1", }) assert.NoError(t, err) assert.EqualValues(t, 0, cnt) diff --git a/statement.go b/statement.go index ea3ecabe..75e69f6c 100644 --- a/statement.go +++ b/statement.go @@ -6,6 +6,7 @@ package xorm import ( "database/sql/driver" + "errors" "fmt" "reflect" "strings" @@ -280,8 +281,8 @@ func (statement *Statement) buildUpdates(bean interface{}, fieldValuePtr, err := col.ValueOf(bean) if err != nil { - engine.logger.Error(err) - continue + statement.lastError = err + return colNames, args } fieldValue := *fieldValuePtr @@ -317,10 +318,10 @@ func (statement *Statement) buildUpdates(bean interface{}, if structConvert, ok := fieldValue.Addr().Interface().(core.Conversion); ok { data, err := structConvert.ToDB() if err != nil { - engine.logger.Error(err) - } else { - val = data + statement.lastError = err + return colNames, args } + val = data goto APPEND } } @@ -328,10 +329,10 @@ func (statement *Statement) buildUpdates(bean interface{}, if structConvert, ok := fieldValue.Interface().(core.Conversion); ok { data, err := structConvert.ToDB() if err != nil { - engine.logger.Error(err) - } else { - val = data + statement.lastError = err + return colNames, args } + val = data goto APPEND } @@ -409,8 +410,8 @@ func (statement *Statement) buildUpdates(bean interface{}, continue } } else { - // TODO: how to handler? - panic("not supported") + statement.lastError = errors.New("Not supported") + return colNames, args } } else { val = fieldValue.Interface() @@ -420,7 +421,8 @@ func (statement *Statement) buildUpdates(bean interface{}, if requiredField || !isStructZero(fieldValue) { bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { - panic(fmt.Sprintf("mashal %v failed", fieldValue.Interface())) + statement.lastError = err + return colNames, args } if col.SQLType.IsText() { val = string(bytes) @@ -449,8 +451,8 @@ func (statement *Statement) buildUpdates(bean interface{}, if col.SQLType.IsText() { bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { - engine.logger.Error(err) - continue + statement.lastError = err + return colNames, args } val = string(bytes) } else if col.SQLType.IsBlob() { @@ -469,8 +471,8 @@ func (statement *Statement) buildUpdates(bean interface{}, } else { bytes, err = DefaultJSONHandler.Marshal(fieldValue.Interface()) if err != nil { - engine.logger.Error(err) - continue + statement.lastError = err + return colNames, args } val = bytes } @@ -483,9 +485,6 @@ func (statement *Statement) buildUpdates(bean interface{}, APPEND: args = append(args, val) - if col.IsPrimaryKey && engine.dialect.DBType() == "ql" { - continue - } colNames = append(colNames, fmt.Sprintf("%v = ?", engine.Quote(col.Name))) } @@ -764,7 +763,7 @@ func (statement *Statement) Join(joinOP string, tablename interface{}, condition statement.joinArgs = append(statement.joinArgs, subQueryArgs...) default: tbName := statement.Engine.TableName(tablename, true) - fmt.Fprintf(&buf, "%s ON %v", tbName, condition) + fmt.Fprintf(&buf, "%s ON %v", statement.Engine.Quote(tbName), condition) } statement.JoinStr = buf.String() diff --git a/statement_test.go b/statement_test.go index cbe590d5..b55fc755 100644 --- a/statement_test.go +++ b/statement_test.go @@ -197,10 +197,11 @@ func TestDistinctAndCols(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - tableName := tableMapper.Obj2Table("DistinctAndCols") + tableName := "`" + tableMapper.Obj2Table("DistinctAndCols") + "`" + nameName := "`" + colMapper.Obj2Table("Name") + "`" var names []string - err = testEngine.Table(tableName).Cols("name").Distinct("name").Find(&names) + err = testEngine.Table(tableName).Cols(nameName).Distinct(nameName).Find(&names) assert.NoError(t, err) assert.EqualValues(t, 1, len(names)) assert.EqualValues(t, "test", names[0]) @@ -214,9 +215,11 @@ func TestUpdateIgnoreOnlyFromDBFields(t *testing.T) { IngoreField string `xorm:"-"` } + idName := colMapper.Obj2Table("Id") + assertGetRecord := func() *TestOnlyFromDBField { var record TestOnlyFromDBField - has, err := testEngine.Where("id = ?", 1).Get(&record) + has, err := testEngine.Where("`"+idName+"` = ?", 1).Get(&record) assert.NoError(t, err) assert.EqualValues(t, true, has) assert.EqualValues(t, "", record.OnlyFromDBField) diff --git a/tag_test.go b/tag_test.go index 056f5c66..32ecbd54 100644 --- a/tag_test.go +++ b/tag_test.go @@ -140,7 +140,8 @@ func TestLowerCase(t *testing.T) { err := testEngine.Sync2(&Lowercase{}) assert.NoError(t, err) - _, err = testEngine.Where("id > 0").Delete(&Lowercase{}) + idName := colMapper.Obj2Table("Id") + _, err = testEngine.Where("`" + idName + "` > 0").Delete(&Lowercase{}) assert.NoError(t, err) _, err = testEngine.Insert(&Lowercase{ended: 1}) @@ -526,7 +527,8 @@ func TestTagTime(t *testing.T) { assert.EqualValues(t, s.Created.Format("2006-01-02 15:04:05"), u.Created.Format("2006-01-02 15:04:05")) var tm string - has, err = testEngine.Table(&s).Cols("created").Get(&tm) + createdName := "`" + colMapper.Obj2Table("Created") + "`" + has, err = testEngine.Table(&s).Cols(createdName).Get(&tm) assert.NoError(t, err) assert.True(t, has) assert.EqualValues(t, s.Created.UTC().Format("2006-01-02 15:04:05"), diff --git a/time_test.go b/time_test.go index 9a821983..f6e773e2 100644 --- a/time_test.go +++ b/time_test.go @@ -286,8 +286,9 @@ func TestTimeUserDeleted(t *testing.T) { fmt.Println("user2", user2.CreatedAt, user2.UpdatedAt, user2.DeletedAt) fmt.Println("user2 str", user2.CreatedAtStr, user2.UpdatedAtStr) + idName := "`" + colMapper.Obj2Table("Id") + "`" var user3 UserDeleted - cnt, err = testEngine.Where("id = ?", "lunny").Delete(&user3) + cnt, err = testEngine.Where(idName+" = ?", "lunny").Delete(&user3) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) assert.True(t, !isTimeZero(user3.DeletedAt)) @@ -340,7 +341,8 @@ func TestTimeUserDeletedDiffLoc(t *testing.T) { fmt.Println("user2", user2.CreatedAt, user2.UpdatedAt, user2.DeletedAt) var user3 UserDeleted2 - cnt, err = testEngine.Where("id = ?", "lunny").Delete(&user3) + idName := "`" + colMapper.Obj2Table("Id") + "`" + cnt, err = testEngine.Where(idName+" = ?", "lunny").Delete(&user3) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) assert.True(t, !isTimeZero(user3.DeletedAt)) @@ -411,7 +413,8 @@ func TestCustomTimeUserDeleted(t *testing.T) { fmt.Println("user2", user2.CreatedAt, user2.UpdatedAt, user2.DeletedAt) var user3 UserDeleted3 - cnt, err = testEngine.Where("id = ?", "lunny").Delete(&user3) + idName := "`" + colMapper.Obj2Table("Id") + "`" + cnt, err = testEngine.Where(idName+" = ?", "lunny").Delete(&user3) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) assert.True(t, !isTimeZero(time.Time(user3.DeletedAt))) @@ -464,7 +467,8 @@ func TestCustomTimeUserDeletedDiffLoc(t *testing.T) { fmt.Println("user2", user2.CreatedAt, user2.UpdatedAt, user2.DeletedAt) var user3 UserDeleted4 - cnt, err = testEngine.Where("id = ?", "lunny").Delete(&user3) + idName := "`" + colMapper.Obj2Table("Id") + "`" + cnt, err = testEngine.Where(idName+" = ?", "lunny").Delete(&user3) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) assert.True(t, !isTimeZero(time.Time(user3.DeletedAt))) diff --git a/types_null_test.go b/types_null_test.go index 7a13837e..9e584c78 100644 --- a/types_null_test.go +++ b/types_null_test.go @@ -60,20 +60,14 @@ func TestCreateNullStructTable(t *testing.T) { assert.NoError(t, prepareEngine()) err := testEngine.CreateTables(new(NullType)) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) } func TestDropNullStructTable(t *testing.T) { assert.NoError(t, prepareEngine()) err := testEngine.DropTables(new(NullType)) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) } func TestNullStructInsert(t *testing.T) { @@ -83,16 +77,9 @@ func TestNullStructInsert(t *testing.T) { if true { item := new(NullType) _, err := testEngine.Insert(item) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) fmt.Println(item) - if item.Id != 1 { - err = errors.New("insert error") - t.Error(err) - panic(err) - } + assert.EqualValues(t, 1, item.Id) } if true { @@ -103,16 +90,9 @@ func TestNullStructInsert(t *testing.T) { IsMan: sql.NullBool{Bool: true, Valid: true}, } _, err := testEngine.Insert(&item) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) fmt.Println(item) - if item.Id != 2 { - err = errors.New("insert error") - t.Error(err) - panic(err) - } + assert.EqualValues(t, 2, item.Id) } if true { @@ -131,10 +111,7 @@ func TestNullStructInsert(t *testing.T) { } _, err := testEngine.Insert(&items) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) fmt.Println(items) } } @@ -171,36 +148,27 @@ func TestNullStructUpdate(t *testing.T) { }) assert.NoError(t, err) + idName := "`" + colMapper.Obj2Table("Id") + "`" + ageName := "`" + colMapper.Obj2Table("Age") + "`" + heightName := "`" + colMapper.Obj2Table("Height") + "`" + isManName := "`" + colMapper.Obj2Table("IsMan") + "`" + if true { // 测试可插入NULL item := new(NullType) item.Age = sql.NullInt64{Int64: 23, Valid: true} item.Height = sql.NullFloat64{Float64: 0, Valid: false} // update to NULL - affected, err := testEngine.ID(2).Cols("age", "height", "is_man").Update(item) - if err != nil { - t.Error(err) - panic(err) - } - if affected != 1 { - err := errors.New("update failed") - t.Error(err) - panic(err) - } + affected, err := testEngine.ID(2).Cols(ageName, heightName, isManName).Update(item) + assert.NoError(t, err) + assert.EqualValues(t, 1, affected) } if true { // 测试In update item := new(NullType) - item.Age = sql.NullInt64{Int64: 23, Valid: true} - affected, err := testEngine.In("id", 3, 4).Cols("age", "height", "is_man").Update(item) - if err != nil { - t.Error(err) - panic(err) - } - if affected != 2 { - err := errors.New("update failed") - t.Error(err) - panic(err) - } + item.Age = sql.NullInt64{23, true} + affected, err := testEngine.In(idName, 3, 4).Cols(ageName, heightName, isManName).Update(item) + assert.NoError(t, err) + assert.EqualValues(t, 2, affected) } if true { // 测试where @@ -209,11 +177,8 @@ func TestNullStructUpdate(t *testing.T) { item.IsMan = sql.NullBool{Bool: true, Valid: true} item.Age = sql.NullInt64{Int64: 34, Valid: true} - _, err := testEngine.Where("age > ?", 34).Update(item) - if err != nil { - t.Error(err) - panic(err) - } + _, err := testEngine.Where(ageName+" > ?", 34).Update(item) + assert.NoError(t, err) } if true { // 修改全部时,插入空值 @@ -225,13 +190,9 @@ func TestNullStructUpdate(t *testing.T) { } _, err := testEngine.AllCols().ID(6).Update(item) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) fmt.Println(item) } - } func TestNullStructFind(t *testing.T) { @@ -269,14 +230,9 @@ func TestNullStructFind(t *testing.T) { if true { item := new(NullType) has, err := testEngine.ID(1).Get(item) - if err != nil { - t.Error(err) - panic(err) - } - if !has { - t.Error(errors.New("no find id 1")) - panic(err) - } + assert.NoError(t, err) + assert.True(t, has) + fmt.Println(item) if item.Id != 1 || item.Name.Valid || item.Age.Valid || item.Height.Valid || item.IsMan.Valid { @@ -291,14 +247,8 @@ func TestNullStructFind(t *testing.T) { item.Id = 2 has, err := testEngine.Get(item) - if err != nil { - t.Error(err) - panic(err) - } - if !has { - t.Error(errors.New("no find id 2")) - panic(err) - } + assert.NoError(t, err) + assert.True(t, has) fmt.Println(item) } @@ -306,23 +256,16 @@ func TestNullStructFind(t *testing.T) { item := make([]NullType, 0) err := testEngine.ID(2).Find(&item) - if err != nil { - t.Error(err) - panic(err) - } - + assert.NoError(t, err) fmt.Println(item) } if true { item := make([]NullType, 0) - err := testEngine.Asc("age").Find(&item) - if err != nil { - t.Error(err) - panic(err) - } - + ageName := "`" + colMapper.Obj2Table("Age") + "`" + err := testEngine.Asc(ageName).Find(&item) + assert.NoError(t, err) for k, v := range item { fmt.Println(k, v) } @@ -334,16 +277,14 @@ func TestNullStructIterate(t *testing.T) { assertSync(t, new(NullType)) if true { - err := testEngine.Where("age IS NOT NULL").OrderBy("age").Iterate(new(NullType), + ageName := "`" + colMapper.Obj2Table("Age") + "`" + err := testEngine.Where(ageName+" IS NOT NULL").OrderBy(ageName).Iterate(new(NullType), func(i int, bean interface{}) error { nultype := bean.(*NullType) fmt.Println(i, nultype) return nil }) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) } } @@ -353,11 +294,9 @@ func TestNullStructCount(t *testing.T) { if true { item := new(NullType) - total, err := testEngine.Where("age IS NOT NULL").Count(item) - if err != nil { - t.Error(err) - panic(err) - } + ageName := "`" + colMapper.Obj2Table("Age") + "`" + total, err := testEngine.Where(ageName + " IS NOT NULL").Count(item) + assert.NoError(t, err) fmt.Println(total) } } @@ -367,19 +306,14 @@ func TestNullStructRows(t *testing.T) { assertSync(t, new(NullType)) item := new(NullType) - rows, err := testEngine.Where("id > ?", 1).Rows(item) - if err != nil { - t.Error(err) - panic(err) - } + idName := "`" + colMapper.Obj2Table("Id") + "`" + rows, err := testEngine.Where(idName+" > ?", 1).Rows(item) + assert.NoError(t, err) defer rows.Close() for rows.Next() { err = rows.Scan(item) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) fmt.Println(item) } } @@ -391,14 +325,9 @@ func TestNullStructDelete(t *testing.T) { item := new(NullType) _, err := testEngine.ID(1).Delete(item) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) - _, err = testEngine.Where("id > ?", 1).Delete(item) - if err != nil { - t.Error(err) - panic(err) - } + idName := "`" + colMapper.Obj2Table("Id") + "`" + _, err = testEngine.Where(idName+" > ?", 1).Delete(item) + assert.NoError(t, err) }