diff --git a/.circleci/config.yml b/.circleci/config.yml index c8f64282..5193fe66 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -44,18 +44,39 @@ jobs: - run: go test -v -race -db="sqlite3" -conn_str="./test.db" -coverprofile=coverage1-1.txt -covermode=atomic - run: go test -v -race -db="sqlite3" -conn_str="./test.db" -cache=true -coverprofile=coverage1-2.txt -covermode=atomic + - run: go test -v -race -db="sqlite3" -conn_str="./test.db" -map_type=same -coverprofile=coverage1-3.txt -covermode=atomic + - run: go test -v -race -db="sqlite3" -conn_str="./test.db" -map_type=same -cache=true -coverprofile=coverage1-4.txt -covermode=atomic + - run: go test -v -race -db="mysql" -conn_str="root:@/xorm_test" -coverprofile=coverage2-1.txt -covermode=atomic - run: go test -v -race -db="mysql" -conn_str="root:@/xorm_test" -cache=true -coverprofile=coverage2-2.txt -covermode=atomic + - run: go test -v -race -db="mysql" -conn_str="root:@/xorm_test" -map_type=same -coverprofile=coverage2-3.txt -covermode=atomic + - run: go test -v -race -db="mysql" -conn_str="root:@/xorm_test" -map_type=same -cache=true -coverprofile=coverage2-4.txt -covermode=atomic + - run: go test -v -race -db="mymysql" -conn_str="xorm_test/root/" -coverprofile=coverage3-1.txt -covermode=atomic - run: go test -v -race -db="mymysql" -conn_str="xorm_test/root/" -cache=true -coverprofile=coverage3-2.txt -covermode=atomic + - run: go test -v -race -db="mymysql" -conn_str="xorm_test/root/" -map_type=same -coverprofile=coverage3-3.txt -covermode=atomic + - run: go test -v -race -db="mymysql" -conn_str="xorm_test/root/" -map_type=same -cache=true -coverprofile=coverage3-4.txt -covermode=atomic + - run: go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -coverprofile=coverage4-1.txt -covermode=atomic - run: go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -cache=true -coverprofile=coverage4-2.txt -covermode=atomic + - run: go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -map_type=same -coverprofile=coverage4-3.txt -covermode=atomic + - run: go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -map_type=same -cache=true -coverprofile=coverage4-4.txt -covermode=atomic + - run: go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -schema=xorm -coverprofile=coverage5-1.txt -covermode=atomic - run: go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -schema=xorm -cache=true -coverprofile=coverage5-2.txt -covermode=atomic + - run: go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -map_type=same -schema=xorm -coverprofile=coverage5-3.txt -covermode=atomic + - run: go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -map_type=same -schema=xorm -cache=true -coverprofile=coverage5-4.txt -covermode=atomic + - run: go test -v -race -db="mssql" -conn_str="server=localhost;user id=sa;password=yourStrong(!)Password;database=xorm_test" -coverprofile=coverage6-1.txt -covermode=atomic - run: go test -v -race -db="mssql" -conn_str="server=localhost;user id=sa;password=yourStrong(!)Password;database=xorm_test" -cache=true -coverprofile=coverage6-2.txt -covermode=atomic + - run: go test -v -race -db="mssql" -conn_str="server=localhost;user id=sa;password=yourStrong(!)Password;database=xorm_test" -map_type=same -coverprofile=coverage6-3.txt -covermode=atomic + - run: go test -v -race -db="mssql" -conn_str="server=localhost;user id=sa;password=yourStrong(!)Password;database=xorm_test" -map_type=same -cache=true -coverprofile=coverage6-4.txt -covermode=atomic + - run: go test -v -race -db="mysql" -conn_str="root:@tcp(localhost:4000)/xorm_test" -ignore_select_update=true -coverprofile=coverage7-1.txt -covermode=atomic - run: go test -v -race -db="mysql" -conn_str="root:@tcp(localhost:4000)/xorm_test" -ignore_select_update=true -cache=true -coverprofile=coverage7-2.txt -covermode=atomic - - run: gocovmerge coverage1-1.txt coverage1-2.txt coverage2-1.txt coverage2-2.txt coverage3-1.txt coverage3-2.txt coverage4-1.txt coverage4-2.txt coverage5-1.txt coverage5-2.txt coverage6-1.txt coverage6-2.txt coverage7-1.txt coverage7-2.txt > coverage.txt + - run: go test -v -race -db="mysql" -conn_str="root:@tcp(localhost:4000)/xorm_test" -map_type=same -ignore_select_update=true -coverprofile=coverage7-3.txt -covermode=atomic + - run: go test -v -race -db="mysql" -conn_str="root:@tcp(localhost:4000)/xorm_test" -map_type=same -ignore_select_update=true -cache=true -coverprofile=coverage7-4.txt -covermode=atomic + + - run: gocovmerge coverage1-1.txt coverage1-2.txt coverage1-3.txt coverage1-4.txt coverage2-1.txt coverage2-2.txt coverage2-3.txt coverage2-4.txt coverage3-1.txt coverage3-2.txt coverage3-3.txt coverage3-4.txt coverage4-1.txt coverage4-2.txt coverage4-3.txt coverage4-4.txt coverage5-1.txt coverage5-2.txt coverage5-3.txt coverage5-4.txt coverage6-1.txt coverage6-2.txt coverage6-3.txt coverage6-4.txt coverage7-1.txt coverage7-2.txt coverage7-3.txt coverage7-4.txt > coverage.txt - run: bash <(curl -s https://codecov.io/bash) \ No newline at end of file diff --git a/cache_test.go b/cache_test.go index 26d7ac68..374fff7d 100644 --- a/cache_test.go +++ b/cache_test.go @@ -59,8 +59,10 @@ func TestCacheFind(t *testing.T) { assert.Equal(t, inserts[i].Password, box.Password) } + idName := mapper.Obj2Table("Id") + boxes = make([]MailBox, 0, 2) - assert.NoError(t, testEngine.Alias("a").Where("a.id > -1").Asc("a.id").Find(&boxes)) + assert.NoError(t, testEngine.Alias("a").Where("`a`.`"+idName+"` > -1").Asc("a."+idName).Find(&boxes)) assert.EqualValues(t, 2, len(boxes)) for i, box := range boxes { assert.Equal(t, inserts[i].Id, box.Id) @@ -74,8 +76,10 @@ func TestCacheFind(t *testing.T) { Password string } + tableName := mapper.Obj2Table("MailBox") + boxes2 := make([]MailBox4, 0, 2) - assert.NoError(t, testEngine.Table("mail_box").Where("mail_box.id > -1").Asc("mail_box.id").Find(&boxes2)) + assert.NoError(t, testEngine.Table(tableName).Where("`"+tableName+"`.`"+idName+"` > -1").Asc(tableName+"."+idName).Find(&boxes2)) assert.EqualValues(t, 2, len(boxes2)) for i, box := range boxes2 { assert.Equal(t, inserts[i].Id, box.Id) @@ -161,15 +165,17 @@ func TestCacheGet(t *testing.T) { _, err := testEngine.Insert(inserts[0]) assert.NoError(t, err) + idName := mapper.Obj2Table("Id") + var box1 MailBox3 - has, err := testEngine.Where("id = ?", inserts[0].Id).Get(&box1) + has, err := testEngine.Where("`"+idName+"` = ?", inserts[0].Id).Get(&box1) assert.NoError(t, err) assert.True(t, has) assert.EqualValues(t, "user1", box1.Username) assert.EqualValues(t, "pass1", box1.Password) var box2 MailBox3 - has, err = testEngine.Where("id = ?", inserts[0].Id).Get(&box2) + has, err = testEngine.Where("`"+idName+"` = ?", inserts[0].Id).Get(&box2) assert.NoError(t, err) assert.True(t, has) assert.EqualValues(t, "user1", box2.Username) diff --git a/engine_table.go b/engine_table.go index eb5aa850..80ad134d 100644 --- a/engine_table.go +++ b/engine_table.go @@ -20,7 +20,7 @@ func (engine *Engine) tbNameWithSchema(v string) string { engine.dialect.URI().Schema != "" && engine.dialect.URI().Schema != postgresPublicSchema && strings.Index(v, ".") == -1 { - return engine.dialect.URI().Schema + "." + v + return engine.Quote(engine.dialect.URI().Schema) + "." + v } return v } diff --git a/session_cols_test.go b/session_cols_test.go index 96cb1620..7628740e 100644 --- a/session_cols_test.go +++ b/session_cols_test.go @@ -48,7 +48,8 @@ func TestSetExpr(t *testing.T) { if testEngine.Dialect().DBType() == core.MSSQL { not = "~" } - cnt, err = testEngine.SetExpr("show", not+" `show`").ID(1).Update(new(UserExpr)) + showName := mapper.Obj2Table("Show") + cnt, err = testEngine.SetExpr(showName, not+" `"+showName+"`").ID(1).Update(new(UserExpr)) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -81,7 +82,9 @@ func TestCols(t *testing.T) { assert.NoError(t, err) sess := testEngine.ID(1) - _, err = sess.Cols("col1").Cols("col2").Update(&ColsTable{ + col1Name := mapper.Obj2Table("Col1") + col2Name := mapper.Obj2Table("Col2") + _, err = sess.Cols(col1Name).Cols(col2Name).Update(&ColsTable{ Col1: "", Col2: "", }) @@ -130,7 +133,8 @@ func TestMustCol(t *testing.T) { } customer.ParentId = 0 - affected, err := testEngine.MustCols("parent_id").Update(&customer, &CustomerOnlyId{Id: customer.Id}) + parentIDName := mapper.Obj2Table("ParentId") + affected, err := testEngine.MustCols(parentIDName).Update(&customer, &CustomerOnlyId{Id: customer.Id}) assert.NoError(t, err) assert.EqualValues(t, 1, affected) } diff --git a/session_cond_test.go b/session_cond_test.go index 10650484..dab14f05 100644 --- a/session_cond_test.go +++ b/session_cond_test.go @@ -36,63 +36,67 @@ func TestBuilder(t *testing.T) { _, err = testEngine.Insert(&Condition{TableName: "table1", ColName: "col1", Op: OpEqual, Value: "1"}) assert.NoError(t, err) + colNameName := "`" + mapper.Obj2Table("ColName") + "`" + opName := "`" + mapper.Obj2Table("Op") + "`" + valueName := "`" + mapper.Obj2Table("Value") + "`" + var cond Condition - has, err := testEngine.Where(builder.Eq{"col_name": "col1"}).Get(&cond) + has, err := testEngine.Where(builder.Eq{colNameName: "col1"}).Get(&cond) assert.NoError(t, err) assert.Equal(t, true, has, "records should exist") - has, err = testEngine.Where(builder.Eq{"col_name": "col1"}. - And(builder.Eq{"op": OpEqual})). + has, err = testEngine.Where(builder.Eq{colNameName: "col1"}. + And(builder.Eq{opName: OpEqual})). NoAutoCondition(). Get(&cond) assert.NoError(t, err) assert.Equal(t, true, has, "records should exist") - has, err = testEngine.Where(builder.Eq{"col_name": "col1", "op": OpEqual, "value": "1"}). + has, err = testEngine.Where(builder.Eq{colNameName: "col1", opName: OpEqual, valueName: "1"}). NoAutoCondition(). Get(&cond) assert.NoError(t, err) assert.Equal(t, true, has, "records should exist") - has, err = testEngine.Where(builder.Eq{"col_name": "col1"}. - And(builder.Neq{"op": OpEqual})). + has, err = testEngine.Where(builder.Eq{colNameName: "col1"}. + And(builder.Neq{opName: OpEqual})). NoAutoCondition(). Get(&cond) assert.NoError(t, err) assert.Equal(t, false, has, "records should not exist") var conds []Condition - err = testEngine.Where(builder.Eq{"col_name": "col1"}. - And(builder.Eq{"op": OpEqual})). + err = testEngine.Where(builder.Eq{colNameName: "col1"}. + And(builder.Eq{opName: OpEqual})). Find(&conds) assert.NoError(t, err) assert.EqualValues(t, 1, len(conds), "records should exist") conds = make([]Condition, 0) - err = testEngine.Where(builder.Like{"col_name", "col"}).Find(&conds) + err = testEngine.Where(builder.Like{colNameName, "col"}).Find(&conds) assert.NoError(t, err) assert.EqualValues(t, 1, len(conds), "records should exist") conds = make([]Condition, 0) - err = testEngine.Where(builder.Expr("col_name = ?", "col1")).Find(&conds) + err = testEngine.Where(builder.Expr(colNameName+" = ?", "col1")).Find(&conds) assert.NoError(t, err) assert.EqualValues(t, 1, len(conds), "records should exist") conds = make([]Condition, 0) - err = testEngine.Where(builder.In("col_name", "col1", "col2")).Find(&conds) + err = testEngine.Where(builder.In(colNameName, "col1", "col2")).Find(&conds) assert.NoError(t, err) assert.EqualValues(t, 1, len(conds), "records should exist") conds = make([]Condition, 0) - err = testEngine.NotIn("col_name", "col1", "col2").Find(&conds) + err = testEngine.NotIn(colNameName, "col1", "col2").Find(&conds) assert.NoError(t, err) assert.EqualValues(t, 0, len(conds), "records should not exist") // complex condtions var where = builder.NewCond() if true { - where = where.And(builder.Eq{"col_name": "col1"}) - where = where.Or(builder.And(builder.In("col_name", "col1", "col2"), builder.Expr("col_name = ?", "col1"))) + where = where.And(builder.Eq{colNameName: "col1"}) + where = where.Or(builder.And(builder.In(colNameName, "col1", "col2"), builder.Expr(colNameName+" = ?", "col1"))) } conds = make([]Condition, 0) @@ -219,7 +223,8 @@ func TestFindAndCount(t *testing.T) { assert.NoError(t, err) var results []FindAndCount - sess := testEngine.Where("name = ?", "test1") + nameName := mapper.Obj2Table("Name") + sess := testEngine.Where("`"+nameName+"` = ?", "test1") conds := sess.Conds() err = sess.Find(&results) assert.NoError(t, err) diff --git a/session_exist_test.go b/session_exist_test.go index 9d985771..c5bf7e24 100644 --- a/session_exist_test.go +++ b/session_exist_test.go @@ -46,31 +46,35 @@ func TestExistStruct(t *testing.T) { assert.NoError(t, err) assert.False(t, has) - has, err = testEngine.Where("name = ?", "test1").Exist(&RecordExist{}) + nameName := "`" + mapper.Obj2Table("Name") + "`" + + has, err = testEngine.Where(nameName+" = ?", "test1").Exist(&RecordExist{}) assert.NoError(t, err) assert.True(t, has) - has, err = testEngine.Where("name = ?", "test2").Exist(&RecordExist{}) + has, err = testEngine.Where(nameName+" = ?", "test2").Exist(&RecordExist{}) assert.NoError(t, err) assert.False(t, has) - has, err = testEngine.SQL("select * from "+testEngine.TableName("record_exist", true)+" where name = ?", "test1").Exist() + tableName := "`" + mapper.Obj2Table("RecordExist") + "`" + + has, err = testEngine.SQL("select * from "+testEngine.TableName(tableName, true)+" where "+nameName+" = ?", "test1").Exist() assert.NoError(t, err) assert.True(t, has) - has, err = testEngine.SQL("select * from "+testEngine.TableName("record_exist", true)+" where name = ?", "test2").Exist() + has, err = testEngine.SQL("select * from "+testEngine.TableName(tableName, true)+" where "+nameName+" = ?", "test2").Exist() assert.NoError(t, err) assert.False(t, has) - has, err = testEngine.Table("record_exist").Exist() + has, err = testEngine.Table(tableName).Exist() assert.NoError(t, err) assert.True(t, has) - has, err = testEngine.Table("record_exist").Where("name = ?", "test1").Exist() + has, err = testEngine.Table(tableName).Where(nameName+" = ?", "test1").Exist() assert.NoError(t, err) assert.True(t, has) - has, err = testEngine.Table("record_exist").Where("name = ?", "test2").Exist() + has, err = testEngine.Table(tableName).Where(nameName+" = ?", "test2").Exist() assert.NoError(t, err) assert.False(t, has) } diff --git a/session_find_test.go b/session_find_test.go index f805f06e..e2a84caf 100644 --- a/session_find_test.go +++ b/session_find_test.go @@ -10,7 +10,6 @@ import ( "testing" "time" - "xorm.io/core" "github.com/stretchr/testify/assert" ) @@ -53,10 +52,18 @@ func TestJoinLimit(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) + tableName := "`" + mapper.Obj2Table("CheckList") + "`" + tableName2 := "`" + mapper.Obj2Table("Salary") + "`" + tableName3 := "`" + mapper.Obj2Table("Empsetting") + "`" + + idName := "`" + mapper.Obj2Table("Id") + "`" + lIDName := "`" + mapper.Obj2Table("Lid") + "`" + eIDName := "`" + mapper.Obj2Table("Eid") + "`" + var salaries []Salary - err = testEngine.Table("salary"). - Join("INNER", "check_list", "check_list.id = salary.lid"). - Join("LEFT", "empsetting", "empsetting.id = check_list.eid"). + err = testEngine.Table(tableName2). + Join("INNER", tableName, tableName+"."+idName+" = "+tableName2+"."+lIDName). + Join("LEFT", tableName3, tableName3+"."+idName+" = "+tableName+"."+eIDName). Limit(10, 0). Find(&salaries) assert.NoError(t, err) @@ -133,7 +140,7 @@ type TeamUser struct { } func (TeamUser) TableName() string { - return "team_user" + return mapper.Obj2Table("TeamUser") } func TestFind3(t *testing.T) { @@ -142,51 +149,58 @@ func TestFind3(t *testing.T) { err := testEngine.Sync2(new(Team), teamUser) assert.NoError(t, err) + tableName := mapper.Obj2Table("TeamUser") + teamTableName := mapper.Obj2Table("Team") + idName := "`" + mapper.Obj2Table("Id") + "`" + orgIDName := "`" + mapper.Obj2Table("OrgId") + "`" + uidName := "`" + mapper.Obj2Table("Uid") + "`" + teamIDName := "`" + mapper.Obj2Table("TeamId") + "`" + var teams []Team - err = testEngine.Cols("`team`.id"). - Where("`team_user`.org_id=?", 1). - And("`team_user`.uid=?", 2). - Join("INNER", "`team_user`", "`team_user`.team_id=`team`.id"). + err = testEngine.Cols("`"+teamTableName+"`."+idName). + Where("`"+tableName+"`."+orgIDName+"=?", 1). + And("`"+tableName+"`."+uidName+"=?", 2). + Join("INNER", "`"+tableName+"`", "`"+tableName+"`."+teamIDName+"=`"+teamTableName+"`."+idName). Find(&teams) assert.NoError(t, err) teams = make([]Team, 0) - err = testEngine.Cols("`team`.id"). - Where("`team_user`.org_id=?", 1). - And("`team_user`.uid=?", 2). - Join("INNER", teamUser, "`team_user`.team_id=`team`.id"). + err = testEngine.Cols("`"+teamTableName+"`."+idName). + Where("`"+tableName+"`."+orgIDName+"=?", 1). + And("`"+tableName+"`."+uidName+"=?", 2). + Join("INNER", teamUser, "`"+tableName+"`."+teamIDName+"=`"+teamTableName+"`."+idName). Find(&teams) assert.NoError(t, err) teams = make([]Team, 0) - err = testEngine.Cols("`team`.id"). - Where("`team_user`.org_id=?", 1). - And("`team_user`.uid=?", 2). - Join("INNER", []interface{}{teamUser}, "`team_user`.team_id=`team`.id"). + err = testEngine.Cols("`"+teamTableName+"`."+idName). + Where("`"+tableName+"`."+orgIDName+"=?", 1). + And("`"+tableName+"`."+uidName+"=?", 2). + Join("INNER", []interface{}{teamUser}, "`"+tableName+"`."+teamIDName+"=`"+teamTableName+"`."+idName). Find(&teams) assert.NoError(t, err) teams = make([]Team, 0) - err = testEngine.Cols("`team`.id"). - Where("`tu`.org_id=?", 1). - And("`tu`.uid=?", 2). - Join("INNER", []string{"team_user", "tu"}, "`tu`.team_id=`team`.id"). + err = testEngine.Cols("`"+teamTableName+"`."+idName). + Where("`tu`."+orgIDName+"=?", 1). + And("`tu`."+uidName+"=?", 2). + Join("INNER", []string{tableName, "tu"}, "`tu`."+teamIDName+"=`"+teamTableName+"`."+idName). Find(&teams) assert.NoError(t, err) teams = make([]Team, 0) - err = testEngine.Cols("`team`.id"). - Where("`tu`.org_id=?", 1). - And("`tu`.uid=?", 2). - Join("INNER", []interface{}{"team_user", "tu"}, "`tu`.team_id=`team`.id"). + err = testEngine.Cols("`"+teamTableName+"`."+idName). + Where("`tu`."+orgIDName+"=?", 1). + And("`tu`."+uidName+"=?", 2). + Join("INNER", []interface{}{tableName, "tu"}, "`tu`."+teamIDName+"=`"+teamTableName+"`."+idName). Find(&teams) assert.NoError(t, err) teams = make([]Team, 0) - err = testEngine.Cols("`team`.id"). - Where("`tu`.org_id=?", 1). - And("`tu`.uid=?", 2). - Join("INNER", []interface{}{teamUser, "tu"}, "`tu`.team_id=`team`.id"). + err = testEngine.Cols("`"+teamTableName+"`."+idName). + Where("`tu`."+orgIDName+"=?", 1). + And("`tu`."+uidName+"=?", 2). + Join("INNER", []interface{}{teamUser, "tu"}, "`tu`."+teamIDName+"=`"+teamTableName+"`."+idName). Find(&teams) assert.NoError(t, err) } @@ -197,10 +211,8 @@ func TestFindMap(t *testing.T) { users := make(map[int64]Userinfo) err := testEngine.Find(&users) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) + for _, user := range users { fmt.Println(user) } @@ -212,10 +224,8 @@ func TestFindMap2(t *testing.T) { users := make(map[int64]*Userinfo) err := testEngine.Find(&users) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) + for id, user := range users { fmt.Println(id, user) } @@ -257,13 +267,17 @@ func TestOrder(t *testing.T) { assert.NoError(t, prepareEngine()) assertSync(t, new(Userinfo)) + idName := "id" + userName := mapper.Obj2Table("Username") + heightName := mapper.Obj2Table("Height") + users := make([]Userinfo, 0) - err := testEngine.OrderBy("id desc").Find(&users) + err := testEngine.OrderBy(idName + " desc").Find(&users) assert.NoError(t, err) fmt.Println(users) users2 := make([]Userinfo, 0) - err = testEngine.Asc("id", "username").Desc("height").Find(&users2) + err = testEngine.Asc(idName, userName).Desc(heightName).Find(&users2) assert.NoError(t, err) fmt.Println(users2) } @@ -272,8 +286,11 @@ func TestGroupBy(t *testing.T) { assert.NoError(t, prepareEngine()) assertSync(t, new(Userinfo)) + idName := "`id`" + userName := mapper.Obj2Table("Username") + users := make([]Userinfo, 0) - err := testEngine.GroupBy("id, username").Find(&users) + err := testEngine.GroupBy(idName + ", `" + userName + "`").Find(&users) assert.NoError(t, err) } @@ -281,8 +298,10 @@ func TestHaving(t *testing.T) { assert.NoError(t, prepareEngine()) assertSync(t, new(Userinfo)) + userName := "`" + mapper.Obj2Table("Username") + "`" + users := make([]Userinfo, 0) - err := testEngine.GroupBy("username").Having("username='xlw'").Find(&users) + err := testEngine.GroupBy(userName).Having(userName + "='xlw'").Find(&users) assert.NoError(t, err) fmt.Println(users) @@ -295,79 +314,36 @@ func TestHaving(t *testing.T) { fmt.Println(users)*/ } -func TestOrderSameMapper(t *testing.T) { - assert.NoError(t, prepareEngine()) - testEngine.UnMapType(rValue(new(Userinfo)).Type()) - - mapper := testEngine.GetTableMapper() - testEngine.SetMapper(core.SameMapper{}) - - defer func() { - testEngine.UnMapType(rValue(new(Userinfo)).Type()) - testEngine.SetMapper(mapper) - }() - - assertSync(t, new(Userinfo)) - - users := make([]Userinfo, 0) - err := testEngine.OrderBy("(id) desc").Find(&users) - assert.NoError(t, err) - fmt.Println(users) - - users2 := make([]Userinfo, 0) - err = testEngine.Asc("(id)", "Username").Desc("Height").Find(&users2) - assert.NoError(t, err) - fmt.Println(users2) -} - -func TestHavingSameMapper(t *testing.T) { - assert.NoError(t, prepareEngine()) - testEngine.UnMapType(rValue(new(Userinfo)).Type()) - - mapper := testEngine.GetTableMapper() - testEngine.SetMapper(core.SameMapper{}) - defer func() { - testEngine.UnMapType(rValue(new(Userinfo)).Type()) - testEngine.SetMapper(mapper) - }() - assertSync(t, new(Userinfo)) - - users := make([]Userinfo, 0) - err := testEngine.GroupBy("`Username`").Having("`Username`='xlw'").Find(&users) - if err != nil { - t.Fatal(err) - } - fmt.Println(users) -} - func TestFindInts(t *testing.T) { assert.NoError(t, prepareEngine()) assertSync(t, new(Userinfo)) userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo") + idName := "id" + var idsInt64 []int64 - err := testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsInt64) + err := testEngine.Table(userinfo).Cols(idName).Desc(idName).Find(&idsInt64) if err != nil { t.Fatal(err) } fmt.Println(idsInt64) var idsInt32 []int32 - err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsInt32) + err = testEngine.Table(userinfo).Cols(idName).Desc(idName).Find(&idsInt32) if err != nil { t.Fatal(err) } fmt.Println(idsInt32) var idsInt []int - err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsInt) + err = testEngine.Table(userinfo).Cols(idName).Desc(idName).Find(&idsInt) if err != nil { t.Fatal(err) } fmt.Println(idsInt) var idsUint []uint - err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsUint) + err = testEngine.Table(userinfo).Cols(idName).Desc(idName).Find(&idsUint) if err != nil { t.Fatal(err) } @@ -375,7 +351,7 @@ func TestFindInts(t *testing.T) { type MyInt int var idsMyInt []MyInt - err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsMyInt) + err = testEngine.Table(userinfo).Cols(idName).Desc(idName).Find(&idsMyInt) if err != nil { t.Fatal(err) } @@ -387,8 +363,10 @@ func TestFindStrings(t *testing.T) { assertSync(t, new(Userinfo)) userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo") username := testEngine.GetColumnMapper().Obj2Table("Username") + idName := "id" + var idsString []string - err := testEngine.Table(userinfo).Cols(username).Desc("id").Find(&idsString) + err := testEngine.Table(userinfo).Cols(username).Desc(idName).Find(&idsString) if err != nil { t.Fatal(err) } @@ -400,9 +378,10 @@ func TestFindMyString(t *testing.T) { assertSync(t, new(Userinfo)) userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo") username := testEngine.GetColumnMapper().Obj2Table("Username") + idName := "id" var idsMyString []MyString - err := testEngine.Table(userinfo).Cols(username).Desc("id").Find(&idsMyString) + err := testEngine.Table(userinfo).Cols(username).Desc(idName).Find(&idsMyString) if err != nil { t.Fatal(err) } @@ -415,8 +394,10 @@ func TestFindInterface(t *testing.T) { userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo") username := testEngine.GetColumnMapper().Obj2Table("Username") + idName := "id" + var idsInterface []interface{} - err := testEngine.Table(userinfo).Cols(username).Desc("id").Find(&idsInterface) + err := testEngine.Table(userinfo).Cols(username).Desc(idName).Find(&idsInterface) if err != nil { t.Fatal(err) } @@ -428,8 +409,10 @@ func TestFindSliceBytes(t *testing.T) { assertSync(t, new(Userinfo)) userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo") + idName := "id" + var ids [][][]byte - err := testEngine.Table(userinfo).Desc("id").Find(&ids) + err := testEngine.Table(userinfo).Desc(idName).Find(&ids) if err != nil { t.Fatal(err) } @@ -443,8 +426,10 @@ func TestFindSlicePtrString(t *testing.T) { assertSync(t, new(Userinfo)) userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo") + idName := "id" + var ids [][]*string - err := testEngine.Table(userinfo).Desc("id").Find(&ids) + err := testEngine.Table(userinfo).Desc(idName).Find(&ids) if err != nil { t.Fatal(err) } @@ -458,8 +443,10 @@ func TestFindMapBytes(t *testing.T) { assertSync(t, new(Userinfo)) userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo") + idName := "id" + var ids []map[string][]byte - err := testEngine.Table(userinfo).Desc("id").Find(&ids) + err := testEngine.Table(userinfo).Desc(idName).Find(&ids) if err != nil { t.Fatal(err) } @@ -473,8 +460,10 @@ func TestFindMapPtrString(t *testing.T) { assertSync(t, new(Userinfo)) userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo") + idName := "id" + var ids []map[string]*string - err := testEngine.Table(userinfo).Desc("id").Find(&ids) + err := testEngine.Table(userinfo).Desc(idName).Find(&ids) assert.NoError(t, err) for _, record := range ids { fmt.Println(record) @@ -508,7 +497,6 @@ func TestFindBit(t *testing.T) { } func TestFindMark(t *testing.T) { - type Mark struct { Mark1 string `xorm:"VARCHAR(1)"` Mark2 string `xorm:"VARCHAR(1)"` @@ -568,27 +556,31 @@ func TestFindAndCountOneFunc(t *testing.T) { assert.EqualValues(t, 2, len(results)) assert.EqualValues(t, 2, cnt) + idName := "`" + mapper.Obj2Table("Id") + "`" + msgName := "`" + mapper.Obj2Table("Msg") + "`" + contentName := "`" + mapper.Obj2Table("Content") + "`" + results = make([]FindAndCountStruct, 0, 1) - cnt, err = testEngine.Where("msg = ?", true).FindAndCount(&results) + cnt, err = testEngine.Where(msgName+" = ?", true).FindAndCount(&results) assert.NoError(t, err) assert.EqualValues(t, 1, len(results)) assert.EqualValues(t, 1, cnt) results = make([]FindAndCountStruct, 0, 1) - cnt, err = testEngine.Where("msg = ?", true).Limit(1).FindAndCount(&results) + cnt, err = testEngine.Where(msgName+" = ?", true).Limit(1).FindAndCount(&results) assert.NoError(t, err) assert.EqualValues(t, 1, len(results)) assert.EqualValues(t, 1, cnt) results = make([]FindAndCountStruct, 0, 1) - cnt, err = testEngine.Where("msg = ?", true).Select("id, content, msg"). + cnt, err = testEngine.Where(msgName+" = ?", true).Select(idName + ", " + contentName + ", " + msgName). Limit(1).FindAndCount(&results) assert.NoError(t, err) assert.EqualValues(t, 1, len(results)) assert.EqualValues(t, 1, cnt) results = make([]FindAndCountStruct, 0, 1) - cnt, err = testEngine.Where("msg = ?", true).Desc("id"). + cnt, err = testEngine.Where(msgName+" = ?", true).Desc(idName). Limit(1).FindAndCount(&results) assert.NoError(t, err) assert.EqualValues(t, 1, len(results)) @@ -617,17 +609,20 @@ func TestFindMapStringId(t *testing.T) { deviceIDs := []string{"1"} + deviceIDName := "`" + mapper.Obj2Table("Deviceid") + "`" + statusName := "`" + mapper.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) @@ -658,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) @@ -791,13 +786,20 @@ func TestFindJoin(t *testing.T) { assert.NoError(t, prepareEngine()) assertSync(t, new(SceneItem), new(DeviceUserPrivrels)) + tableName1 := "`" + mapper.Obj2Table("SceneItem") + "`" + tableName2 := "`" + mapper.Obj2Table("DeviceUserPrivrels") + "`" + + deviceIDName := "`" + mapper.Obj2Table("DeviceId") + "`" + userIDName := "`" + mapper.Obj2Table("UserId") + "`" + typeName := "`" + mapper.Obj2Table("Type") + "`" + var scenes []SceneItem - err := testEngine.Join("LEFT OUTER", "device_user_privrels", "device_user_privrels.device_id=scene_item.device_id"). - Where("scene_item.type=?", 3).Or("device_user_privrels.user_id=?", 339).Find(&scenes) + err := testEngine.Join("LEFT OUTER", tableName2, tableName1+"."+deviceIDName+"="+tableName2+"."+deviceIDName). + Where(tableName1+"."+typeName+"=?", 3).Or(tableName2+"."+userIDName+"=?", 339).Find(&scenes) assert.NoError(t, err) scenes = make([]SceneItem, 0) - err = testEngine.Join("LEFT OUTER", new(DeviceUserPrivrels), "device_user_privrels.device_id=scene_item.device_id"). - Where("scene_item.type=?", 3).Or("device_user_privrels.user_id=?", 339).Find(&scenes) + err = testEngine.Join("LEFT OUTER", new(DeviceUserPrivrels), tableName1+"."+deviceIDName+"="+tableName2+"."+deviceIDName). + Where(tableName1+"."+typeName+"=?", 3).Or(tableName2+"."+userIDName+"=?", 339).Find(&scenes) assert.NoError(t, err) } diff --git a/session_get_test.go b/session_get_test.go index f93068c8..e05b824e 100644 --- a/session_get_test.go +++ b/session_get_test.go @@ -35,14 +35,20 @@ func TestGetVar(t *testing.T) { _, err := testEngine.InsertOne(&data) assert.NoError(t, err) + tableName := "`" + mapper.Obj2Table("GetVar") + "`" + idName := mapper.Obj2Table("Id") + msgName := mapper.Obj2Table("Msg") + ageName := mapper.Obj2Table("Age") + moneyName := mapper.Obj2Table("Money") + var msg string - has, err := testEngine.Table("get_var").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("get_var").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) @@ -54,9 +60,9 @@ func TestGetVar(t *testing.T) { assert.Equal(t, 28, ageMax) var age2 int64 - has, err = testEngine.Table("get_var").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) @@ -126,72 +132,72 @@ func TestGetVar(t *testing.T) { assert.EqualValues(t, 28, age10) var id sql.NullInt64 - has, err = testEngine.Table("get_var").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("get_var").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("get_var").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("get_var").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("get_var", 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("get_var", 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("get_var", 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) var valuesString = make(map[string]string) - has, err = testEngine.Table("get_var").Get(&valuesString) + has, err = testEngine.Table(tableName).Get(&valuesString) assert.NoError(t, err) assert.Equal(t, true, has) assert.Equal(t, 5, len(valuesString)) - assert.Equal(t, "1", valuesString["id"]) - assert.Equal(t, "hi", valuesString["msg"]) - assert.Equal(t, "28", valuesString["age"]) - assert.Equal(t, "1.5", valuesString["money"]) + assert.Equal(t, "1", valuesString[idName]) + assert.Equal(t, "hi", valuesString[msgName]) + assert.Equal(t, "28", valuesString[ageName]) + assert.Equal(t, "1.5", valuesString[moneyName]) // 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("get_var").Where("id = ?", 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)) - assert.EqualValues(t, 1, valuesInter["id"]) - assert.Equal(t, "hi", fmt.Sprintf("%s", valuesInter["msg"])) - assert.EqualValues(t, 28, valuesInter["age"]) - assert.Equal(t, "1.5", fmt.Sprintf("%v", valuesInter["money"])) + assert.EqualValues(t, 1, valuesInter[idName]) + assert.Equal(t, "hi", fmt.Sprintf("%s", valuesInter[msgName])) + assert.EqualValues(t, 28, valuesInter[ageName]) + assert.Equal(t, "1.5", fmt.Sprintf("%v", valuesInter[moneyName])) } var valuesSliceString = make([]string, 5) - has, err = testEngine.Table("get_var").Get(&valuesSliceString) + has, err = testEngine.Table(tableName).Get(&valuesSliceString) assert.NoError(t, err) assert.Equal(t, true, has) assert.Equal(t, "1", valuesSliceString[0]) @@ -200,7 +206,7 @@ func TestGetVar(t *testing.T) { assert.Equal(t, "1.5", valuesSliceString[3]) var valuesSliceInter = make([]interface{}, 5) - has, err = testEngine.Table("get_var").Get(&valuesSliceInter) + has, err = testEngine.Table(tableName).Get(&valuesSliceInter) assert.NoError(t, err) assert.Equal(t, true, has) @@ -329,15 +335,17 @@ func TestJSONString(t *testing.T) { }) assert.NoError(t, err) + tableName := mapper.Obj2Table("JsonJson") + var js JsonString - has, err := testEngine.Table("json_json").Get(&js) + has, err := testEngine.Table(tableName).Get(&js) assert.NoError(t, err) assert.True(t, has) assert.EqualValues(t, 1, js.Id) assert.EqualValues(t, `["1","2"]`, js.Content) var jss []JsonString - err = testEngine.Table("json_json").Find(&jss) + err = testEngine.Table(tableName).Find(&jss) assert.NoError(t, err) assert.EqualValues(t, 1, len(jss)) assert.EqualValues(t, `["1","2"]`, jss[0].Content) @@ -366,9 +374,12 @@ func TestGetActionMapping(t *testing.T) { }) assert.NoError(t, err) + scriptIdName := mapper.Obj2Table("ScriptId") + rollbackIdName := mapper.Obj2Table("RollbackId") + var valuesSlice = make([]string, 2) has, err := testEngine.Table(new(ActionMapping)). - Cols("script_id", "rollback_id"). + Cols(scriptIdName, rollbackIdName). ID("1").Get(&valuesSlice) assert.NoError(t, err) assert.True(t, has) @@ -393,9 +404,10 @@ func TestGetStructId(t *testing.T) { Id int64 } + idName := "`" + mapper.Obj2Table("Id") + "`" //var id int64 var maxid maxidst - sql := "select max(id) 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 2785401d..aeac44f6 100644 --- a/session_insert_test.go +++ b/session_insert_test.go @@ -494,7 +494,8 @@ func TestDefaultTime3(t *testing.T) { Cuser: "userId", Muser: "userId", } - cnt, err := testEngine.Omit("end_time").InsertOne(prepareTask) + endTimeName := mapper.Obj2Table("EndTime") + cnt, err := testEngine.Omit(endTimeName).InsertOne(prepareTask) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) } @@ -767,10 +768,14 @@ func TestInsertMap(t *testing.T) { assert.NoError(t, prepareEngine()) assertSync(t, new(InsertMap)) + widthName := mapper.Obj2Table("Width") + heightName := mapper.Obj2Table("Height") + nameName := mapper.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) @@ -783,10 +788,12 @@ func TestInsertMap(t *testing.T) { assert.EqualValues(t, 10, im.Height) assert.EqualValues(t, "lunny", im.Name) - cnt, err = testEngine.Table("insert_map").Insert(map[string]interface{}{ - "width": 30, - "height": 10, - "name": "lunny", + tableName := mapper.Obj2Table("InsertMap") + + cnt, err = testEngine.Table(tableName).Insert(map[string]interface{}{ + widthName: 30, + heightName: 10, + nameName: "lunny", }) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -802,16 +809,16 @@ func TestInsertMap(t *testing.T) { assert.EqualValues(t, 10, ims[1].Height) assert.EqualValues(t, "lunny", ims[1].Name) - cnt, err = testEngine.Table("insert_map").Insert([]map[string]interface{}{ + 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 772206a8..b7f48deb 100644 --- a/session_query_test.go +++ b/session_query_test.go @@ -37,14 +37,22 @@ func TestQueryString(t *testing.T) { _, err := testEngine.InsertOne(data) assert.NoError(t, err) - records, err := testEngine.QueryString("select * from " + testEngine.TableName("get_var2", true)) + tableName := mapper.Obj2Table("GetVar2") + + 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])) - assert.Equal(t, "1", records[0]["id"]) - assert.Equal(t, "hi", records[0]["msg"]) - assert.Equal(t, "28", records[0]["age"]) - assert.Equal(t, "1.5", records[0]["money"]) + + idName := mapper.Obj2Table("Id") + ageName := mapper.Obj2Table("Age") + msgName := mapper.Obj2Table("Msg") + moneyName := mapper.Obj2Table("Money") + + assert.Equal(t, "1", records[0][idName]) + assert.Equal(t, "hi", records[0][msgName]) + assert.Equal(t, "28", records[0][ageName]) + assert.Equal(t, "1.5", records[0][moneyName]) } func TestQueryString2(t *testing.T) { @@ -63,12 +71,17 @@ func TestQueryString2(t *testing.T) { _, err := testEngine.Insert(data) assert.NoError(t, err) - records, err := testEngine.QueryString("select * from " + testEngine.TableName("get_var3", true)) + tableName := "`" + mapper.Obj2Table("GetVar3") + "`" + + idName := mapper.Obj2Table("Id") + msgName := mapper.Obj2Table("Msg") + + records, err := testEngine.QueryString("select * from " + testEngine.TableName(tableName, true)) assert.NoError(t, err) assert.Equal(t, 1, len(records)) assert.Equal(t, 2, len(records[0])) - assert.Equal(t, "1", records[0]["id"]) - assert.True(t, "0" == records[0]["msg"] || "false" == records[0]["msg"]) + assert.Equal(t, "1", records[0][idName]) + assert.True(t, "0" == records[0][msgName] || "false" == records[0][msgName]) } func toString(i interface{}) string { @@ -128,14 +141,20 @@ func TestQueryInterface(t *testing.T) { _, err := testEngine.InsertOne(data) assert.NoError(t, err) - records, err := testEngine.QueryInterface("select * from " + testEngine.TableName("get_var_interface", true)) + tableName := "`" + mapper.Obj2Table("GetVarInterface") + "`" + idName := mapper.Obj2Table("Id") + msgName := mapper.Obj2Table("Msg") + ageName := mapper.Obj2Table("Age") + moneyName := mapper.Obj2Table("Money") + + records, err := testEngine.QueryInterface("select * from " + testEngine.TableName(tableName, true)) assert.NoError(t, err) assert.Equal(t, 1, len(records)) assert.Equal(t, 5, len(records[0])) - assert.EqualValues(t, 1, toInt64(records[0]["id"])) - assert.Equal(t, "hi", toString(records[0]["msg"])) - assert.EqualValues(t, 28, toInt64(records[0]["age"])) - assert.EqualValues(t, 1.5, toFloat64(records[0]["money"])) + assert.EqualValues(t, 1, toInt64(records[0][idName])) + assert.Equal(t, "hi", toString(records[0][msgName])) + assert.EqualValues(t, 28, toInt64(records[0][ageName])) + assert.EqualValues(t, 1.5, toFloat64(records[0][moneyName])) } func TestQueryNoParams(t *testing.T) { @@ -162,27 +181,33 @@ func TestQueryNoParams(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) + idName := mapper.Obj2Table("Id") + msgName := mapper.Obj2Table("Msg") + ageName := mapper.Obj2Table("Age") + moneyName := mapper.Obj2Table("Money") + assertResult := func(t *testing.T, results []map[string][]byte) { assert.EqualValues(t, 1, len(results)) - id, err := strconv.ParseInt(string(results[0]["id"]), 10, 64) + id, err := strconv.ParseInt(string(results[0][idName]), 10, 64) assert.NoError(t, err) assert.EqualValues(t, 1, id) - assert.Equal(t, "message", string(results[0]["msg"])) + assert.Equal(t, "message", string(results[0][msgName])) - age, err := strconv.Atoi(string(results[0]["age"])) + age, err := strconv.Atoi(string(results[0][ageName])) assert.NoError(t, err) assert.EqualValues(t, 20, age) - money, err := strconv.ParseFloat(string(results[0]["money"]), 32) + money, err := strconv.ParseFloat(string(results[0][moneyName]), 32) assert.NoError(t, err) assert.EqualValues(t, 3000, money) } - results, err := testEngine.Table("query_no_params").Limit(10).Query() + tableName := "`" + mapper.Obj2Table("QueryNoParams") + "`" + results, err := testEngine.Table(tableName).Limit(10).Query() assert.NoError(t, err) assertResult(t, results) - results, err = testEngine.SQL("select * from " + testEngine.TableName("query_no_params", true)).Query() + results, err = testEngine.SQL("select * from " + testEngine.TableName(tableName, true)).Query() assert.NoError(t, err) assertResult(t, results) } @@ -203,24 +228,29 @@ func TestQueryStringNoParam(t *testing.T) { _, err := testEngine.Insert(data) assert.NoError(t, err) - records, err := testEngine.Table("get_var4").Limit(1).QueryString() + tableName := "`" + mapper.Obj2Table("GetVar4") + "`" + + idName := mapper.Obj2Table("Id") + msgName := mapper.Obj2Table("Msg") + + records, err := testEngine.Table(tableName).Limit(1).QueryString() assert.NoError(t, err) assert.EqualValues(t, 1, len(records)) - assert.EqualValues(t, "1", records[0]["id"]) + assert.EqualValues(t, "1", records[0][idName]) if testEngine.Dialect().DBType() == core.POSTGRES || testEngine.Dialect().DBType() == core.MSSQL { - assert.EqualValues(t, "false", records[0]["msg"]) + assert.EqualValues(t, "false", records[0][msgName]) } else { - assert.EqualValues(t, "0", records[0]["msg"]) + assert.EqualValues(t, "0", records[0][msgName]) } - records, err = testEngine.Table("get_var4").Where(builder.Eq{"id": 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]["id"]) + assert.EqualValues(t, "1", records[0][idName]) if testEngine.Dialect().DBType() == core.POSTGRES || testEngine.Dialect().DBType() == core.MSSQL { - assert.EqualValues(t, "false", records[0]["msg"]) + assert.EqualValues(t, "false", records[0][msgName]) } else { - assert.EqualValues(t, "0", records[0]["msg"]) + assert.EqualValues(t, "0", records[0][msgName]) } } @@ -240,7 +270,9 @@ func TestQuerySliceStringNoParam(t *testing.T) { _, err := testEngine.Insert(data) assert.NoError(t, err) - records, err := testEngine.Table("get_var6").Limit(1).QuerySliceString() + tableName := "`" + mapper.Obj2Table("GetVar6") + "`" + + records, err := testEngine.Table(tableName).Limit(1).QuerySliceString() assert.NoError(t, err) assert.EqualValues(t, 1, len(records)) assert.EqualValues(t, "1", records[0][0]) @@ -250,7 +282,8 @@ func TestQuerySliceStringNoParam(t *testing.T) { assert.EqualValues(t, "0", records[0][1]) } - records, err = testEngine.Table("get_var6").Where(builder.Eq{"id": 1}).QuerySliceString() + idName := mapper.Obj2Table("Id") + 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]) @@ -277,17 +310,21 @@ func TestQueryInterfaceNoParam(t *testing.T) { _, err := testEngine.Insert(data) assert.NoError(t, err) - records, err := testEngine.Table("get_var5").Limit(1).QueryInterface() - assert.NoError(t, err) - assert.EqualValues(t, 1, len(records)) - assert.EqualValues(t, 1, toInt64(records[0]["id"])) - assert.EqualValues(t, 0, toInt64(records[0]["msg"])) + tableName := "`" + mapper.Obj2Table("GetVar5") + "`" + idName := mapper.Obj2Table("Id") + msgName := mapper.Obj2Table("Msg") - records, err = testEngine.Table("get_var5").Where(builder.Eq{"id": 1}).QueryInterface() + records, err := testEngine.Table(tableName).Limit(1).QueryInterface() assert.NoError(t, err) assert.EqualValues(t, 1, len(records)) - assert.EqualValues(t, 1, toInt64(records[0]["id"])) - assert.EqualValues(t, 0, toInt64(records[0]["msg"])) + 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() + assert.NoError(t, err) + assert.EqualValues(t, 1, len(records)) + assert.EqualValues(t, 1, toInt64(records[0][idName])) + assert.EqualValues(t, 0, toInt64(records[0][msgName])) } func TestQueryWithBuilder(t *testing.T) { @@ -314,23 +351,29 @@ func TestQueryWithBuilder(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) + idName := mapper.Obj2Table("Id") + msgName := mapper.Obj2Table("Msg") + ageName := mapper.Obj2Table("Age") + moneyName := mapper.Obj2Table("Money") + assertResult := func(t *testing.T, results []map[string][]byte) { assert.EqualValues(t, 1, len(results)) - id, err := strconv.ParseInt(string(results[0]["id"]), 10, 64) + id, err := strconv.ParseInt(string(results[0][idName]), 10, 64) assert.NoError(t, err) assert.EqualValues(t, 1, id) - assert.Equal(t, "message", string(results[0]["msg"])) + assert.Equal(t, "message", string(results[0][msgName])) - age, err := strconv.Atoi(string(results[0]["age"])) + age, err := strconv.Atoi(string(results[0][ageName])) assert.NoError(t, err) assert.EqualValues(t, 20, age) - money, err := strconv.ParseFloat(string(results[0]["money"]), 32) + money, err := strconv.ParseFloat(string(results[0][moneyName]), 32) assert.NoError(t, err) assert.EqualValues(t, 3000, money) } - results, err := testEngine.Query(builder.Select("*").From(testEngine.TableName("query_with_builder", true))) + tableName := mapper.Obj2Table("QueryWithBuilder") + results, err := testEngine.Query(builder.Select("*").From("`" + testEngine.TableName(tableName, true) + "`")) assert.NoError(t, err) assertResult(t, results) } @@ -371,9 +414,15 @@ func TestJoinWithSubQuery(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) + tableName := "`" + mapper.Obj2Table("JoinWithSubQueryDepart") + "`" + tableName1 := "`" + mapper.Obj2Table("JoinWithSubQuery1") + "`" + + departID := "`" + mapper.Obj2Table("DepartId") + "`" + idName := "`" + mapper.Obj2Table("Id") + "`" + var querys []JoinWithSubQuery1 - err = testEngine.Join("INNER", builder.Select("id").From(testEngine.Quote(testEngine.TableName("join_with_sub_query_depart", true))), - "join_with_sub_query_depart.id = join_with_sub_query1.depart_id").Find(&querys) + err = testEngine.Join("INNER", builder.Select(idName).From(testEngine.Quote(testEngine.TableName(tableName, true))), + tableName+"."+idName+" = "+tableName1+"."+departID).Find(&querys) assert.NoError(t, err) assert.EqualValues(t, 1, len(querys)) assert.EqualValues(t, q, querys[0]) diff --git a/session_raw_test.go b/session_raw_test.go index 766206a4..26ba3b09 100644 --- a/session_raw_test.go +++ b/session_raw_test.go @@ -21,17 +21,21 @@ func TestExecAndQuery(t *testing.T) { assert.NoError(t, testEngine.Sync2(new(UserinfoQuery))) - res, err := testEngine.Exec("INSERT INTO "+testEngine.TableName("`userinfo_query`", true)+" (uid, name) VALUES (?, ?)", 1, "user") + tableName := mapper.Obj2Table("UserinfoQuery") + uidName := mapper.Obj2Table("Uid") + nameName := mapper.Obj2Table("Name") + + 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("userinfo_query", 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]["uid"])) + id, err := strconv.Atoi(string(results[0][uidName])) assert.NoError(t, err) assert.EqualValues(t, 1, id) - assert.Equal(t, "user", string(results[0]["name"])) + assert.Equal(t, "user", string(results[0][nameName])) } diff --git a/session_schema_test.go b/session_schema_test.go index 5a0fca2e..f655a225 100644 --- a/session_schema_test.go +++ b/session_schema_test.go @@ -79,7 +79,7 @@ type SyncTable2 struct { } func (SyncTable2) TableName() string { - return "sync_table1" + return mapper.Obj2Table("SyncTable1") } type SyncTable3 struct { @@ -91,7 +91,7 @@ type SyncTable3 struct { } func (s *SyncTable3) TableName() string { - return "sync_table1" + return mapper.Obj2Table("SyncTable1") } func TestSyncTable(t *testing.T) { @@ -99,24 +99,26 @@ func TestSyncTable(t *testing.T) { assert.NoError(t, testEngine.Sync2(new(SyncTable1))) + tableName := mapper.Obj2Table("SyncTable1") + tables, err := testEngine.DBMetas() assert.NoError(t, err) assert.EqualValues(t, 1, len(tables)) - assert.EqualValues(t, "sync_table1", tables[0].Name) + assert.EqualValues(t, tableName, tables[0].Name) assert.NoError(t, testEngine.Sync2(new(SyncTable2))) tables, err = testEngine.DBMetas() assert.NoError(t, err) assert.EqualValues(t, 1, len(tables)) - assert.EqualValues(t, "sync_table1", tables[0].Name) + assert.EqualValues(t, tableName, tables[0].Name) assert.NoError(t, testEngine.Sync2(new(SyncTable3))) tables, err = testEngine.DBMetas() assert.NoError(t, err) assert.EqualValues(t, 1, len(tables)) - assert.EqualValues(t, "sync_table1", tables[0].Name) + assert.EqualValues(t, tableName, tables[0].Name) } func TestIsTableExist(t *testing.T) { @@ -227,8 +229,10 @@ func TestMetaInfo(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 2, len(tables)) tableNames := []string{tables[0].Name, tables[1].Name} + + tableName2 := mapper.Obj2Table("IndexOrUnique") assert.Contains(t, tableNames, "customtablename") - assert.Contains(t, tableNames, "index_or_unique") + assert.Contains(t, tableNames, tableName2) } func TestCharst(t *testing.T) { @@ -273,10 +277,12 @@ func TestUnique_1(t *testing.T) { assert.NoError(t, prepareEngine()) - assert.NoError(t, testEngine.DropTables("user_unique")) + tableName := mapper.Obj2Table("UserUnique") + + assert.NoError(t, testEngine.DropTables(tableName)) assert.NoError(t, testEngine.Sync2(new(UserUnique))) - assert.NoError(t, testEngine.DropTables("user_unique")) + assert.NoError(t, testEngine.DropTables(tableName)) assert.NoError(t, testEngine.CreateTables(new(UserUnique))) assert.NoError(t, testEngine.CreateUniques(new(UserUnique))) } diff --git a/session_stats_test.go b/session_stats_test.go index 01c76ba5..868bb8ab 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 := mapper.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)) } @@ -186,11 +187,12 @@ func TestCount(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, total) - total, err = testEngine.Where(cond).Table("userinfo_count").Count() + tableName := mapper.Obj2Table("UserinfoCount") + total, err = testEngine.Where(cond).Table(tableName).Count() assert.NoError(t, err) assert.EqualValues(t, 1, total) - total, err = testEngine.Table("userinfo_count").Count() + total, err = testEngine.Table(tableName).Count() assert.NoError(t, err) assert.EqualValues(t, 1, total) } @@ -211,8 +213,9 @@ func TestSQLCount(t *testing.T) { assertSync(t, new(UserinfoCount2), new(UserinfoBooks)) - total, err := testEngine.SQL("SELECT count(id) FROM " + testEngine.TableName("userinfo_count2", true)). - Count() + tableName := mapper.Obj2Table("UserinfoCount2") + idName := mapper.Obj2Table("Id") + total, err := testEngine.SQL("SELECT count(`" + idName + "`) FROM `" + testEngine.TableName(tableName, true) + "`").Count() assert.NoError(t, err) assert.EqualValues(t, 0, total) } @@ -237,7 +240,8 @@ func TestCountWithOthers(t *testing.T) { }) assert.NoError(t, err) - total, err := testEngine.OrderBy("id desc").Limit(1).Count(new(CountWithOthers)) + idName := mapper.Obj2Table("Id") + total, err := testEngine.OrderBy(idName + " desc").Limit(1).Count(new(CountWithOthers)) assert.NoError(t, err) assert.EqualValues(t, 2, total) } @@ -266,11 +270,13 @@ func TestWithTableName(t *testing.T) { }) assert.NoError(t, err) - total, err := testEngine.OrderBy("id desc").Count(new(CountWithTableName)) + idName := mapper.Obj2Table("Id") + + total, err := testEngine.OrderBy(idName + " desc").Count(new(CountWithTableName)) assert.NoError(t, err) assert.EqualValues(t, 2, total) - total, err = testEngine.OrderBy("id desc").Count(CountWithTableName{}) + total, err = testEngine.OrderBy(idName + " desc").Count(CountWithTableName{}) assert.NoError(t, err) assert.EqualValues(t, 2, total) } diff --git a/session_tx_test.go b/session_tx_test.go index 23e1bf28..ea88343c 100644 --- a/session_tx_test.go +++ b/session_tx_test.go @@ -9,7 +9,6 @@ import ( "testing" "time" - "xorm.io/core" "github.com/stretchr/testify/assert" ) @@ -73,56 +72,14 @@ func TestCombineTransaction(t *testing.T) { _, err = session.Insert(&user1) assert.NoError(t, err) + tableName := mapper.Obj2Table("Userinfo") + userName := mapper.Obj2Table("Username") + user2 := Userinfo{Username: "zzz"} _, err = session.Where("id = ?", 0).Update(&user2) assert.NoError(t, err) - _, err = session.Exec("delete from "+testEngine.TableName("userinfo", true)+" where username = ?", user2.Username) - assert.NoError(t, err) - - err = session.Commit() - assert.NoError(t, err) -} - -func TestCombineTransactionSameMapper(t *testing.T) { - assert.NoError(t, prepareEngine()) - - oldMapper := testEngine.GetColumnMapper() - testEngine.UnMapType(rValue(new(Userinfo)).Type()) - testEngine.SetMapper(core.SameMapper{}) - defer func() { - testEngine.UnMapType(rValue(new(Userinfo)).Type()) - testEngine.SetMapper(oldMapper) - }() - - assertSync(t, new(Userinfo)) - - counter := func() { - total, err := testEngine.Count(&Userinfo{}) - if err != nil { - t.Error(err) - } - fmt.Printf("----now total %v records\n", total) - } - - counter() - defer counter() - - session := testEngine.NewSession() - defer session.Close() - - err := session.Begin() - assert.NoError(t, err) - - user1 := Userinfo{Username: "xiaoxiao2", Departname: "dev", Alias: "lunny", Created: time.Now()} - _, err = session.Insert(&user1) - assert.NoError(t, err) - - user2 := Userinfo{Username: "zzz"} - _, err = session.Where("(id) = ?", 0).Update(&user2) - assert.NoError(t, err) - - _, err = session.Exec("delete from "+testEngine.TableName("`Userinfo`", 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() @@ -150,7 +107,8 @@ func TestMultipleTransaction(t *testing.T) { assert.NoError(t, err) user2 := MultipleTransaction{Name: "zzz"} - _, err = session.Where("id = ?", 0).Update(&user2) + idName := mapper.Obj2Table("Id") + _, err = session.Where("`"+idName+"` = ?", 0).Update(&user2) assert.NoError(t, err) err = session.Commit() @@ -164,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 c5c65a45..1bb0e65e 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 c90ec5bd..6120654a 100644 --- a/session_update_test.go +++ b/session_update_test.go @@ -12,7 +12,6 @@ import ( "time" "github.com/stretchr/testify/assert" - "xorm.io/core" ) func TestUpdateMap(t *testing.T) { @@ -32,9 +31,14 @@ func TestUpdateMap(t *testing.T) { _, err := testEngine.Insert(&tb) assert.NoError(t, err) - cnt, err := testEngine.Table("update_table").Where("id = ?", tb.Id).Update(map[string]interface{}{ - "name": "test2", - "age": 36, + tableName := mapper.Obj2Table("UpdateTable") + nameName := mapper.Obj2Table("Name") + ageName := mapper.Obj2Table("Age") + idName := mapper.Obj2Table("Id") + + cnt, err := testEngine.Table(tableName).Where("`"+idName+"` = ?", tb.Id).Update(map[string]interface{}{ + nameName: "test2", + ageName: 36, }) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -64,7 +68,9 @@ func TestUpdateLimit(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - cnt, err = testEngine.OrderBy("name desc").Limit(1).Update(&UpdateTable2{ + nameName := "`" + mapper.Obj2Table("Name") + "`" + + cnt, err = testEngine.OrderBy(nameName + " desc").Limit(1).Update(&UpdateTable2{ Age: 30, }) assert.NoError(t, err) @@ -268,13 +274,11 @@ func TestUpdateMap2(t *testing.T) { assert.NoError(t, prepareEngine()) assertSync(t, new(UpdateMustCols)) - _, err := testEngine.Table("update_must_cols").Where("id =?", 1).Update(map[string]interface{}{ - "bool": true, + tableName := mapper.Obj2Table("UpdateMustCols") + _, err := testEngine.Table(tableName).Where("`"+mapper.Obj2Table("Id")+"` =?", 1).Update(map[string]interface{}{ + mapper.Obj2Table("Bool"): true, }) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) } func TestUpdate1(t *testing.T) { @@ -287,176 +291,91 @@ func TestUpdate1(t *testing.T) { var ori Userinfo has, err := testEngine.Get(&ori) - if err != nil { - t.Error(err) - panic(err) - } - if !has { - t.Error(errors.New("not exist")) - panic(errors.New("not exist")) - } + assert.NoError(t, err) + assert.True(t, has) // update by id user := Userinfo{Username: "xxx", Height: 1.2} cnt, err := testEngine.ID(ori.Uid).Update(&user) - if err != nil { - t.Error(err) - panic(err) - } - if cnt != 1 { - err = errors.New("update not returned 1") - t.Error(err) - panic(err) - return - } + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) - condi := Condi{"username": "zzz", "departname": ""} + userName := "`" + mapper.Obj2Table("Username") + "`" + heightName := "`" + mapper.Obj2Table("Height") + "`" + departName := "`" + mapper.Obj2Table("Departname") + "`" + detailIDName := "`detail_id`" + isMan := "`" + mapper.Obj2Table("IsMan") + "`" + createdName := "`" + mapper.Obj2Table("Created") + "`" + + condi := Condi{userName: "zzz", departName: ""} cnt, err = testEngine.Table(&user).ID(ori.Uid).Update(&condi) - if err != nil { - t.Error(err) - panic(err) - } - if cnt != 1 { - err = errors.New("update not returned 1") - t.Error(err) - panic(err) - return - } + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) cnt, err = testEngine.Update(&Userinfo{Username: "yyy"}, &user) - if err != nil { - t.Error(err) - panic(err) - } - total, err := testEngine.Count(&user) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) - if cnt != total { - err = errors.New("insert not returned 1") - t.Error(err) - panic(err) - return - } + total, err := testEngine.Count(&user) + assert.NoError(t, err) + assert.EqualValues(t, total, cnt) // nullable update { user := &Userinfo{Username: "not null data", Height: 180.5} _, err := testEngine.Insert(user) - if err != nil { - t.Error(err) - panic(err) - } - userID := user.Uid + assert.NoError(t, err) + userID := user.Uid has, err := testEngine.ID(userID). - And("username = ?", user.Username). - And("height = ?", user.Height). - And("departname = ?", ""). - And("detail_id = ?", 0). - And("is_man = ?", 0). + And(userName+" = ?", user.Username). + And(heightName+" = ?", user.Height). + And(departName+" = ?", ""). + And(detailIDName+" = ?", 0). + And(isMan+" = ?", 0). Get(&Userinfo{}) - if err != nil { - t.Error(err) - panic(err) - } - if !has { - err = errors.New("cannot insert properly") - t.Error(err) - panic(err) - } + assert.NoError(t, err) + assert.True(t, has) updatedUser := &Userinfo{Username: "null data"} cnt, err = testEngine.ID(userID). - Nullable("height", "departname", "is_man", "created"). + Nullable(heightName, departName, isMan, createdName). Update(updatedUser) - if err != nil { - t.Error(err) - panic(err) - } - if cnt != 1 { - err = errors.New("update not returned 1") - t.Error(err) - panic(err) - } + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) has, err = testEngine.ID(userID). - And("username = ?", updatedUser.Username). - And("height IS NULL"). - And("departname IS NULL"). - And("is_man IS NULL"). - And("created IS NULL"). - And("detail_id = ?", 0). + And(userName+" = ?", updatedUser.Username). + And(heightName+" IS NULL"). + And(departName+" IS NULL"). + And(isMan+" IS NULL"). + And(createdName+" IS NULL"). + And(detailIDName+" = ?", 0). Get(&Userinfo{}) - if err != nil { - t.Error(err) - panic(err) - } - if !has { - err = errors.New("cannot update with null properly") - t.Error(err) - panic(err) - } + assert.NoError(t, err) + assert.True(t, has) cnt, err = testEngine.ID(userID).Delete(&Userinfo{}) - if err != nil { - t.Error(err) - panic(err) - } - if cnt != 1 { - err = errors.New("delete not returned 1") - t.Error(err) - panic(err) - } + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) } err = testEngine.StoreEngine("Innodb").Sync2(&Article{}) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) defer func() { err = testEngine.DropTables(&Article{}) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) }() a := &Article{0, "1", "2", "3", "4", "5", 2} cnt, err = testEngine.Insert(a) - if err != nil { - t.Error(err) - panic(err) - } - - if cnt != 1 { - err = errors.New(fmt.Sprintf("insert not returned 1 but %d", cnt)) - t.Error(err) - panic(err) - } - - if a.Id == 0 { - err = errors.New("insert returned id is 0") - t.Error(err) - panic(err) - } + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + assert.True(t, a.Id > 0) cnt, err = testEngine.ID(a.Id).Update(&Article{Name: "6"}) - if err != nil { - t.Error(err) - panic(err) - } - - if cnt != 1 { - err = errors.New(fmt.Sprintf("insert not returned 1 but %d", cnt)) - t.Error(err) - panic(err) - return - } + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) var s = "test" @@ -474,65 +393,28 @@ func TestUpdate1(t *testing.T) { col3 := &UpdateAllCols{} has, err = testEngine.ID(col2.Id).Get(col3) assert.NoError(t, err) - - if !has { - err = errors.New(fmt.Sprintf("cannot get id %d", col2.Id)) - t.Error(err) - panic(err) - return - } - - if *col2 != *col3 { - err = errors.New(fmt.Sprintf("col2 should eq col3")) - t.Error(err) - panic(err) - return - } + assert.True(t, has) + assert.EqualValues(t, *col3, *col2) { - col1 := &UpdateMustCols{} err = testEngine.Sync(col1) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) _, err = testEngine.Insert(col1) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) col2 := &UpdateMustCols{col1.Id, true, ""} boolStr := testEngine.GetColumnMapper().Obj2Table("Bool") stringStr := testEngine.GetColumnMapper().Obj2Table("String") _, err = testEngine.ID(col2.Id).MustCols(boolStr, stringStr).Update(col2) - if err != nil { - t.Error(err) - panic(err) - } + assert.NoError(t, err) col3 := &UpdateMustCols{} has, err := testEngine.ID(col2.Id).Get(col3) - if err != nil { - t.Error(err) - panic(err) - } - - if !has { - err = errors.New(fmt.Sprintf("cannot get id %d", col2.Id)) - t.Error(err) - panic(err) - return - } - - if *col2 != *col3 { - err = errors.New(fmt.Sprintf("col2 should eq col3")) - t.Error(err) - panic(err) - return - } + assert.NoError(t, err) + assert.True(t, has) + assert.EqualValues(t, *col3, *col2) } } @@ -744,197 +626,6 @@ func TestUpdateUpdated(t *testing.T) { fmt.Println("ci5:", ci5, "di5:", di5) } -func TestUpdateSameMapper(t *testing.T) { - assert.NoError(t, prepareEngine()) - - oldMapper := testEngine.GetTableMapper() - testEngine.UnMapType(rValue(new(Userinfo)).Type()) - testEngine.UnMapType(rValue(new(Condi)).Type()) - testEngine.UnMapType(rValue(new(Article)).Type()) - testEngine.UnMapType(rValue(new(UpdateAllCols)).Type()) - testEngine.UnMapType(rValue(new(UpdateMustCols)).Type()) - testEngine.UnMapType(rValue(new(UpdateIncr)).Type()) - testEngine.SetMapper(core.SameMapper{}) - defer func() { - testEngine.UnMapType(rValue(new(Userinfo)).Type()) - testEngine.UnMapType(rValue(new(Condi)).Type()) - testEngine.UnMapType(rValue(new(Article)).Type()) - testEngine.UnMapType(rValue(new(UpdateAllCols)).Type()) - testEngine.UnMapType(rValue(new(UpdateMustCols)).Type()) - testEngine.UnMapType(rValue(new(UpdateIncr)).Type()) - testEngine.SetMapper(oldMapper) - }() - - assertSync(t, new(Userinfo)) - - _, err := testEngine.Insert(&Userinfo{ - Username: "user1", - }) - assert.NoError(t, err) - - var ori Userinfo - has, err := testEngine.Get(&ori) - assert.NoError(t, err) - assert.True(t, has) - - // update by id - user := Userinfo{Username: "xxx", Height: 1.2} - cnt, err := testEngine.ID(ori.Uid).Update(&user) - assert.NoError(t, err) - assert.EqualValues(t, 1, cnt) - - condi := Condi{"Username": "zzz", "Departname": ""} - cnt, err = testEngine.Table(&user).ID(ori.Uid).Update(&condi) - assert.NoError(t, err) - assert.EqualValues(t, 1, cnt) - - cnt, err = testEngine.Update(&Userinfo{Username: "yyy"}, &user) - assert.NoError(t, err) - - total, err := testEngine.Count(&user) - assert.NoError(t, err) - assert.EqualValues(t, cnt, total) - - err = testEngine.Sync(&Article{}) - assert.NoError(t, err) - - defer func() { - err = testEngine.DropTables(&Article{}) - assert.NoError(t, err) - }() - - a := &Article{0, "1", "2", "3", "4", "5", 2} - cnt, err = testEngine.Insert(a) - assert.NoError(t, err) - - if cnt != 1 { - err = errors.New(fmt.Sprintf("insert not returned 1 but %d", cnt)) - t.Error(err) - panic(err) - } - - if a.Id == 0 { - err = errors.New("insert returned id is 0") - t.Error(err) - panic(err) - } - - cnt, err = testEngine.ID(a.Id).Update(&Article{Name: "6"}) - assert.NoError(t, err) - - if cnt != 1 { - err = errors.New(fmt.Sprintf("insert not returned 1 but %d", cnt)) - t.Error(err) - panic(err) - return - } - - col1 := &UpdateAllCols{} - err = testEngine.Sync(col1) - assert.NoError(t, err) - - _, err = testEngine.Insert(col1) - assert.NoError(t, err) - - col2 := &UpdateAllCols{col1.Id, true, "", nil} - _, err = testEngine.ID(col2.Id).AllCols().Update(col2) - assert.NoError(t, err) - - col3 := &UpdateAllCols{} - has, err = testEngine.ID(col2.Id).Get(col3) - assert.NoError(t, err) - - if !has { - err = errors.New(fmt.Sprintf("cannot get id %d", col2.Id)) - t.Error(err) - panic(err) - return - } - - if *col2 != *col3 { - err = errors.New(fmt.Sprintf("col2 should eq col3")) - t.Error(err) - panic(err) - return - } - - { - col1 := &UpdateMustCols{} - err = testEngine.Sync(col1) - assert.NoError(t, err) - - _, err = testEngine.Insert(col1) - assert.NoError(t, err) - - col2 := &UpdateMustCols{col1.Id, true, ""} - boolStr := testEngine.GetColumnMapper().Obj2Table("Bool") - stringStr := testEngine.GetColumnMapper().Obj2Table("String") - _, err = testEngine.ID(col2.Id).MustCols(boolStr, stringStr).Update(col2) - assert.NoError(t, err) - - col3 := &UpdateMustCols{} - has, err := testEngine.ID(col2.Id).Get(col3) - assert.NoError(t, err) - - if !has { - err = errors.New(fmt.Sprintf("cannot get id %d", col2.Id)) - t.Error(err) - panic(err) - return - } - - if *col2 != *col3 { - err = errors.New(fmt.Sprintf("col2 should eq col3")) - t.Error(err) - panic(err) - return - } - } - - { - col1 := &UpdateIncr{} - err = testEngine.Sync(col1) - if err != nil { - t.Error(err) - panic(err) - } - - _, err = testEngine.Insert(col1) - if err != nil { - t.Error(err) - panic(err) - } - - cnt, err := testEngine.ID(col1.Id).Incr("`Cnt`").Update(col1) - if err != nil { - t.Error(err) - panic(err) - } - if cnt != 1 { - err = errors.New("update incr failed") - t.Error(err) - panic(err) - } - - newCol := new(UpdateIncr) - has, err := testEngine.ID(col1.Id).Get(newCol) - if err != nil { - t.Error(err) - panic(err) - } - if !has { - err = errors.New("has incr failed") - t.Error(err) - panic(err) - } - if 1 != newCol.Cnt { - err = errors.New("incr failed") - t.Error(err) - panic(err) - } - } -} - func TestUseBool(t *testing.T) { assert.NoError(t, prepareEngine()) assertSync(t, new(Userinfo)) @@ -1067,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 := "`" + mapper.Obj2Table("Phone") + "`" + + af, err = testEngine.Table(new(TbUserInfo)).Where(phoneName+"=?", 13126564922).Update(&changeUsr) assert.NoError(t, err) assert.EqualValues(t, 0, af) } @@ -1155,8 +848,9 @@ func TestDeletedUpdate(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) + deletedAtName := mapper.Obj2Table("DeletedAt") s.DeletedAt = time.Time{} - cnt, err = testEngine.Unscoped().Nullable("deleted_at").Update(&s) + cnt, err = testEngine.Unscoped().Nullable(deletedAtName).Update(&s) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -1168,11 +862,11 @@ func TestDeletedUpdate(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - cnt, err = testEngine.ID(s.Id).Cols("deleted_at").Update(&DeletedUpdatedStruct{}) + cnt, err = testEngine.ID(s.Id).Cols(deletedAtName).Update(&DeletedUpdatedStruct{}) assert.EqualValues(t, "No content found to be updated", err.Error()) assert.EqualValues(t, 0, cnt) - cnt, err = testEngine.ID(s.Id).Unscoped().Cols("deleted_at").Update(&DeletedUpdatedStruct{}) + cnt, err = testEngine.ID(s.Id).Unscoped().Cols(deletedAtName).Update(&DeletedUpdatedStruct{}) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -1197,10 +891,12 @@ func TestUpdateMapCondition(t *testing.T) { _, err := testEngine.Insert(&c) assert.NoError(t, err) + idName := "`" + mapper.Obj2Table("Id") + "`" + cnt, err := testEngine.Update(&UpdateMapCondition{ String: "string1", }, map[string]interface{}{ - "id": c.Id, + idName: c.Id, }) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -1235,7 +931,11 @@ func TestUpdateMapContent(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 18, c.Age) - cnt, err := testEngine.Table(new(UpdateMapContent)).ID(c.Id).Update(map[string]interface{}{"age": 0}) + ageName := mapper.Obj2Table("Age") + isManName := mapper.Obj2Table("IsMan") + genderName := mapper.Obj2Table("Gender") + + cnt, err := testEngine.Table(new(UpdateMapContent)).ID(c.Id).Update(map[string]interface{}{ageName: 0}) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -1246,9 +946,9 @@ func TestUpdateMapContent(t *testing.T) { assert.EqualValues(t, 0, c1.Age) cnt, err = testEngine.Table(new(UpdateMapContent)).ID(c.Id).Update(map[string]interface{}{ - "age": 16, - "is_man": false, - "gender": 2, + ageName: 16, + isManName: false, + genderName: 2, }) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -1262,9 +962,9 @@ func TestUpdateMapContent(t *testing.T) { assert.EqualValues(t, 2, c2.Gender) cnt, err = testEngine.Table(testEngine.TableName(new(UpdateMapContent))).ID(c.Id).Update(map[string]interface{}{ - "age": 15, - "is_man": true, - "gender": 1, + ageName: 15, + isManName: true, + genderName: 1, }) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -1378,8 +1078,10 @@ func TestUpdateDeleted(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 0, cnt) + nameName := mapper.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 3cc0831e..bab140f6 100644 --- a/statement.go +++ b/statement.go @@ -6,6 +6,7 @@ package xorm import ( "database/sql/driver" + "errors" "fmt" "reflect" "strings" @@ -268,8 +269,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 @@ -305,10 +306,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 } } @@ -316,10 +317,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 } @@ -397,8 +398,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() @@ -408,7 +409,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) @@ -437,8 +439,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() { @@ -457,8 +459,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 } @@ -471,9 +473,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))) } @@ -752,7 +751,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 acc542ab..48ef6000 100644 --- a/statement_test.go +++ b/statement_test.go @@ -197,8 +197,11 @@ func TestDistinctAndCols(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) + tableName := "`" + mapper.Obj2Table("DistinctAndCols") + "`" + nameName := "`" + mapper.Obj2Table("Name") + "`" + var names []string - err = testEngine.Table("distinct_and_cols").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]) @@ -212,9 +215,11 @@ func TestUpdateIgnoreOnlyFromDBFields(t *testing.T) { IngoreField string `xorm:"-"` } + idName := mapper.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 891c6ffc..f0d02560 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 := mapper.Obj2Table("Id") + _, err = testEngine.Where("`" + idName + "` > 0").Delete(&Lowercase{}) assert.NoError(t, err) _, err = testEngine.Insert(&Lowercase{ended: 1}) @@ -159,12 +160,14 @@ func TestAutoIncrTag(t *testing.T) { Id int64 } + idName := mapper.Obj2Table("Id") + tb := testEngine.TableInfo(new(TestAutoIncr1)) cols := tb.Columns() assert.EqualValues(t, 1, len(cols)) assert.True(t, cols[0].IsAutoIncrement) assert.True(t, cols[0].IsPrimaryKey) - assert.Equal(t, "id", cols[0].Name) + assert.Equal(t, idName, cols[0].Name) type TestAutoIncr2 struct { Id int64 `xorm:"id"` @@ -197,7 +200,7 @@ func TestAutoIncrTag(t *testing.T) { assert.EqualValues(t, 1, len(cols)) assert.False(t, cols[0].IsAutoIncrement) assert.True(t, cols[0].IsPrimaryKey) - assert.Equal(t, "id", cols[0].Name) + assert.Equal(t, idName, cols[0].Name) } func TestTagComment(t *testing.T) { @@ -524,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("tag_u_t_c_struct").Cols("created").Get(&tm) + createdName := "`" + mapper.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 b7e4d12b..3a27f43b 100644 --- a/time_test.go +++ b/time_test.go @@ -283,8 +283,9 @@ func TestTimeUserDeleted(t *testing.T) { assert.True(t, isTimeZero(user2.DeletedAt)) fmt.Println("user2", user2.CreatedAt, user2.UpdatedAt, user2.DeletedAt) + idName := "`" + mapper.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)) @@ -337,7 +338,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 := "`" + mapper.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)) @@ -408,7 +410,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 := "`" + mapper.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))) @@ -461,7 +464,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 := "`" + mapper.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 22fc1024..c347b399 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{true, 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 := "`" + mapper.Obj2Table("Id") + "`" + ageName := "`" + mapper.Obj2Table("Age") + "`" + heightName := "`" + mapper.Obj2Table("Height") + "`" + isManName := "`" + mapper.Obj2Table("IsMan") + "`" + if true { // 测试可插入NULL item := new(NullType) item.Age = sql.NullInt64{23, true} item.Height = sql.NullFloat64{0, 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{23, 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) - } + 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{true, true} item.Age = sql.NullInt64{34, 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 := "`" + mapper.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 := "`" + mapper.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 := "`" + mapper.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 := "`" + mapper.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 := "`" + mapper.Obj2Table("Id") + "`" + _, err = testEngine.Where(idName+" > ?", 1).Delete(item) + assert.NoError(t, err) } diff --git a/xorm_test.go b/xorm_test.go index c0302df3..654533b1 100644 --- a/xorm_test.go +++ b/xorm_test.go @@ -35,6 +35,8 @@ var ( splitter = flag.String("splitter", ";", "the splitter on connstr for cluster") schema = flag.String("schema", "", "specify the schema") ignoreSelectUpdate = flag.Bool("ignore_select_update", false, "ignore select update if implementation difference, only for tidb") + + mapper core.IMapper ) func createEngine(dbType, connStr string) error { @@ -113,11 +115,14 @@ func createEngine(dbType, connStr string) error { if len(*mapType) > 0 { switch *mapType { case "snake": - testEngine.SetMapper(core.SnakeMapper{}) + mapper = core.SnakeMapper{} case "same": - testEngine.SetMapper(core.SameMapper{}) + mapper = core.SameMapper{} case "gonic": - testEngine.SetMapper(core.LintGonicMapper) + mapper = core.LintGonicMapper + } + if mapper != nil { + testEngine.SetMapper(mapper) } } }