fix insert return id bugs on mssql

This commit is contained in:
Lunny Xiao 2019-01-22 23:33:16 +08:00
parent f2f5d7a118
commit 64e637a443
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
11 changed files with 583 additions and 720 deletions

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,7 @@ import (
"testing" "testing"
"time" "time"
"github.com/go-xorm/core"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -21,11 +22,27 @@ func TestDelete(t *testing.T) {
assert.NoError(t, testEngine.Sync2(new(UserinfoDelete))) assert.NoError(t, testEngine.Sync2(new(UserinfoDelete)))
session := testEngine.NewSession()
defer session.Close()
var err error
if testEngine.Dialect().DBType() == core.MSSQL {
err = session.Begin()
assert.NoError(t, err)
_, err = session.Exec("SET IDENTITY_INSERT userinfo_delete ON")
assert.NoError(t, err)
}
user := UserinfoDelete{Uid: 1} user := UserinfoDelete{Uid: 1}
cnt, err := testEngine.Insert(&user) cnt, err := session.Insert(&user)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, cnt) assert.EqualValues(t, 1, cnt)
if testEngine.Dialect().DBType() == core.MSSQL {
err = session.Commit()
assert.NoError(t, err)
}
cnt, err = testEngine.Delete(&UserinfoDelete{Uid: user.Uid}) cnt, err = testEngine.Delete(&UserinfoDelete{Uid: user.Uid})
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, cnt) assert.EqualValues(t, 1, cnt)
@ -40,7 +57,7 @@ func TestDelete(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, cnt) assert.EqualValues(t, 1, cnt)
cnt, err = testEngine.Where("id=?", user.Uid).Delete(&UserinfoDelete{}) cnt, err = testEngine.Where("`id`=?", user.Uid).Delete(&UserinfoDelete{})
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, cnt) assert.EqualValues(t, 1, cnt)

View File

@ -41,14 +41,14 @@ func (session *Session) Exist(bean ...interface{}) (bool, error) {
} }
if session.engine.dialect.DBType() == core.MSSQL { if session.engine.dialect.DBType() == core.MSSQL {
sqlStr = fmt.Sprintf("SELECT top 1 * FROM %s WHERE %s", tableName, condSQL) sqlStr = fmt.Sprintf("SELECT TOP 1 * FROM %s WHERE %s", tableName, condSQL)
} else { } else {
sqlStr = fmt.Sprintf("SELECT * FROM %s WHERE %s LIMIT 1", tableName, condSQL) sqlStr = fmt.Sprintf("SELECT * FROM %s WHERE %s LIMIT 1", tableName, condSQL)
} }
args = condArgs args = condArgs
} else { } else {
if session.engine.dialect.DBType() == core.MSSQL { if session.engine.dialect.DBType() == core.MSSQL {
sqlStr = fmt.Sprintf("SELECT top 1 * FROM %s", tableName) sqlStr = fmt.Sprintf("SELECT TOP 1 * FROM %s", tableName)
} else { } else {
sqlStr = fmt.Sprintf("SELECT * FROM %s LIMIT 1", tableName) sqlStr = fmt.Sprintf("SELECT * FROM %s LIMIT 1", tableName)
} }

View File

@ -84,7 +84,11 @@ func TestGetVar(t *testing.T) {
assert.Equal(t, "1.5", fmt.Sprintf("%.1f", money)) assert.Equal(t, "1.5", fmt.Sprintf("%.1f", money))
var money2 float64 var money2 float64
has, err = testEngine.SQL("SELECT money FROM " + testEngine.TableName("get_var", true) + " LIMIT 1").Get(&money2) if testEngine.Dialect().DBType() == core.MSSQL {
has, err = testEngine.SQL("SELECT TOP 1 money FROM " + testEngine.TableName("get_var", true)).Get(&money2)
} else {
has, err = testEngine.SQL("SELECT money FROM " + testEngine.TableName("get_var", true) + " LIMIT 1").Get(&money2)
}
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, true, has) assert.Equal(t, true, has)
assert.Equal(t, "1.5", fmt.Sprintf("%.1f", money2)) assert.Equal(t, "1.5", fmt.Sprintf("%.1f", money2))
@ -156,14 +160,23 @@ func TestGetStruct(t *testing.T) {
assert.NoError(t, testEngine.Sync2(new(UserinfoGet))) assert.NoError(t, testEngine.Sync2(new(UserinfoGet)))
session := testEngine.NewSession()
defer session.Close()
var err error var err error
if testEngine.Dialect().DBType() == core.MSSQL { if testEngine.Dialect().DBType() == core.MSSQL {
_, err = testEngine.Exec("SET IDENTITY_INSERT userinfo_get ON") err = session.Begin()
assert.NoError(t, err)
_, err = session.Exec("SET IDENTITY_INSERT userinfo_get ON")
assert.NoError(t, err) assert.NoError(t, err)
} }
cnt, err := testEngine.Insert(&UserinfoGet{Uid: 2}) cnt, err := session.Insert(&UserinfoGet{Uid: 2})
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, cnt) assert.EqualValues(t, 1, cnt)
if testEngine.Dialect().DBType() == core.MSSQL {
err = session.Commit()
assert.NoError(t, err)
}
user := UserinfoGet{Uid: 2} user := UserinfoGet{Uid: 2}
has, err := testEngine.Get(&user) has, err := testEngine.Get(&user)

View File

@ -373,21 +373,30 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) {
var sqlStr string var sqlStr string
var tableName = session.statement.TableName() var tableName = session.statement.TableName()
var output string
if session.engine.dialect.DBType() == core.MSSQL && len(table.AutoIncrement) > 0 {
output = fmt.Sprintf(" OUTPUT Inserted.%s", table.AutoIncrement)
}
if len(colPlaces) > 0 { if len(colPlaces) > 0 {
sqlStr = fmt.Sprintf("INSERT INTO %s (%v%v%v) VALUES (%v)", sqlStr = fmt.Sprintf("INSERT INTO %s (%v%v%v)%s VALUES (%v)",
session.engine.Quote(tableName), session.engine.Quote(tableName),
session.engine.QuoteStr(), session.engine.QuoteStr(),
strings.Join(colNames, session.engine.Quote(", ")), strings.Join(colNames, session.engine.Quote(", ")),
session.engine.QuoteStr(), session.engine.QuoteStr(),
output,
colPlaces) colPlaces)
} else { } else {
if session.engine.dialect.DBType() == core.MYSQL { if session.engine.dialect.DBType() == core.MYSQL {
sqlStr = fmt.Sprintf("INSERT INTO %s VALUES ()", session.engine.Quote(tableName)) sqlStr = fmt.Sprintf("INSERT INTO %s VALUES ()", session.engine.Quote(tableName))
} else { } else {
sqlStr = fmt.Sprintf("INSERT INTO %s DEFAULT VALUES", session.engine.Quote(tableName)) sqlStr = fmt.Sprintf("INSERT INTO %s%s DEFAULT VALUES", session.engine.Quote(tableName), output)
} }
} }
if len(table.AutoIncrement) > 0 && session.engine.dialect.DBType() == core.POSTGRES {
sqlStr = sqlStr + " RETURNING " + session.engine.Quote(table.AutoIncrement)
}
handleAfterInsertProcessorFunc := func(bean interface{}) { handleAfterInsertProcessorFunc := func(bean interface{}) {
if session.isAutoCommit { if session.isAutoCommit {
for _, closure := range session.afterClosures { for _, closure := range session.afterClosures {
@ -459,9 +468,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) {
aiValue.Set(int64ToIntValue(id, aiValue.Type())) aiValue.Set(int64ToIntValue(id, aiValue.Type()))
return 1, nil return 1, nil
} else if session.engine.dialect.DBType() == core.POSTGRES && len(table.AutoIncrement) > 0 { } else if len(table.AutoIncrement) > 0 && (session.engine.dialect.DBType() == core.POSTGRES || session.engine.dialect.DBType() == core.MSSQL) {
//assert table.AutoIncrement != ""
sqlStr = sqlStr + " RETURNING " + session.engine.Quote(table.AutoIncrement)
res, err := session.queryBytes(sqlStr, args...) res, err := session.queryBytes(sqlStr, args...)
if err != nil { if err != nil {
@ -481,7 +488,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) {
} }
if len(res) < 1 { if len(res) < 1 {
return 0, errors.New("insert no error but not returned id") return 0, errors.New("insert successfully but not returned id")
} }
idByte := res[0][table.AutoIncrement] idByte := res[0][table.AutoIncrement]

View File

@ -145,41 +145,22 @@ func TestInsert(t *testing.T) {
user := Userinfo{0, "xiaolunwen", "dev", "lunny", time.Now(), user := Userinfo{0, "xiaolunwen", "dev", "lunny", time.Now(),
Userdetail{Id: 1}, 1.78, []byte{1, 2, 3}, true} Userdetail{Id: 1}, 1.78, []byte{1, 2, 3}, true}
cnt, err := testEngine.Insert(&user) cnt, err := testEngine.Insert(&user)
fmt.Println(user.Uid) assert.NoError(t, err)
if err != nil { assert.EqualValues(t, 1, cnt, "insert not returned 1")
t.Error(err) assert.True(t, user.Uid > 0, "not return id error")
panic(err)
}
if cnt != 1 {
err = errors.New("insert not returned 1")
t.Error(err)
panic(err)
}
if user.Uid <= 0 {
err = errors.New("not return id error")
t.Error(err)
panic(err)
}
user.Uid = 0 user.Uid = 0
cnt, err = testEngine.Insert(&user) cnt, err = testEngine.Insert(&user)
// Username is unique, so this should return error
assert.Error(t, err, "insert should fail but no error returned")
assert.EqualValues(t, 0, cnt, "insert not returned 1")
if err == nil { if err == nil {
err = errors.New("insert failed but no return error") panic("should return err")
t.Error(err)
panic(err)
}
if cnt != 0 {
err = errors.New("insert not returned 1")
t.Error(err)
panic(err)
return
} }
} }
func TestInsertAutoIncr(t *testing.T) { func TestInsertAutoIncr(t *testing.T) {
assert.NoError(t, prepareEngine()) assert.NoError(t, prepareEngine())
assertSync(t, new(Userinfo)) assertSync(t, new(Userinfo))
// auto increment insert // auto increment insert
@ -214,20 +195,14 @@ func TestInsertDefault(t *testing.T) {
di := new(DefaultInsert) di := new(DefaultInsert)
err := testEngine.Sync2(di) err := testEngine.Sync2(di)
if err != nil { assert.NoError(t, err)
t.Error(err)
}
var di2 = DefaultInsert{Name: "test"} var di2 = DefaultInsert{Name: "test"}
_, err = testEngine.Omit(testEngine.GetColumnMapper().Obj2Table("Status")).Insert(&di2) _, err = testEngine.Omit(testEngine.GetColumnMapper().Obj2Table("Status")).Insert(&di2)
if err != nil { assert.NoError(t, err)
t.Error(err)
}
has, err := testEngine.Desc("(id)").Get(di) has, err := testEngine.Desc("(id)").Get(di)
if err != nil { assert.NoError(t, err)
t.Error(err)
}
if !has { if !has {
err = errors.New("error with no data") err = errors.New("error with no data")
t.Error(err) t.Error(err)

View File

@ -207,7 +207,7 @@ func TestQueryStringNoParam(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, len(records)) assert.EqualValues(t, 1, len(records))
assert.EqualValues(t, "1", records[0]["id"]) assert.EqualValues(t, "1", records[0]["id"])
if testEngine.Dialect().URI().DbType == core.POSTGRES { if testEngine.Dialect().DBType() == core.POSTGRES || testEngine.Dialect().DBType() == core.MSSQL {
assert.EqualValues(t, "false", records[0]["msg"]) assert.EqualValues(t, "false", records[0]["msg"])
} else { } else {
assert.EqualValues(t, "0", records[0]["msg"]) assert.EqualValues(t, "0", records[0]["msg"])
@ -217,7 +217,7 @@ func TestQueryStringNoParam(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, len(records)) assert.EqualValues(t, 1, len(records))
assert.EqualValues(t, "1", records[0]["id"]) assert.EqualValues(t, "1", records[0]["id"])
if testEngine.Dialect().URI().DbType == core.POSTGRES { if testEngine.Dialect().DBType() == core.POSTGRES || testEngine.Dialect().DBType() == core.MSSQL {
assert.EqualValues(t, "false", records[0]["msg"]) assert.EqualValues(t, "false", records[0]["msg"])
} else { } else {
assert.EqualValues(t, "0", records[0]["msg"]) assert.EqualValues(t, "0", records[0]["msg"])
@ -244,7 +244,7 @@ func TestQuerySliceStringNoParam(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, len(records)) assert.EqualValues(t, 1, len(records))
assert.EqualValues(t, "1", records[0][0]) assert.EqualValues(t, "1", records[0][0])
if testEngine.Dialect().URI().DbType == core.POSTGRES { if testEngine.Dialect().DBType() == core.POSTGRES || testEngine.Dialect().DBType() == core.MSSQL {
assert.EqualValues(t, "false", records[0][1]) assert.EqualValues(t, "false", records[0][1])
} else { } else {
assert.EqualValues(t, "0", records[0][1]) assert.EqualValues(t, "0", records[0][1])
@ -254,7 +254,7 @@ func TestQuerySliceStringNoParam(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, len(records)) assert.EqualValues(t, 1, len(records))
assert.EqualValues(t, "1", records[0][0]) assert.EqualValues(t, "1", records[0][0])
if testEngine.Dialect().URI().DbType == core.POSTGRES { if testEngine.Dialect().DBType() == core.POSTGRES || testEngine.Dialect().DBType() == core.MSSQL {
assert.EqualValues(t, "false", records[0][1]) assert.EqualValues(t, "false", records[0][1])
} else { } else {
assert.EqualValues(t, "0", records[0][1]) assert.EqualValues(t, "0", records[0][1])

View File

@ -1089,7 +1089,7 @@ func (statement *Statement) genSelectSQL(columnStr, condSQL string, needLimit, n
if dialect.DBType() == core.MSSQL { if dialect.DBType() == core.MSSQL {
if statement.LimitN > 0 { if statement.LimitN > 0 {
top = fmt.Sprintf(" TOP %d ", statement.LimitN) top = fmt.Sprintf("TOP %d ", statement.LimitN)
} }
if statement.Start > 0 { if statement.Start > 0 {
var column string var column string

View File

@ -60,63 +60,37 @@ func TestExtends(t *testing.T) {
assert.NoError(t, prepareEngine()) assert.NoError(t, prepareEngine())
err := testEngine.DropTables(&tempUser2{}) err := testEngine.DropTables(&tempUser2{})
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
err = testEngine.CreateTables(&tempUser2{}) err = testEngine.CreateTables(&tempUser2{})
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
tu := &tempUser2{tempUser{0, "extends"}, "dev depart"} tu := &tempUser2{tempUser{0, "extends"}, "dev depart"}
_, err = testEngine.Insert(tu) _, err = testEngine.Insert(tu)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
tu2 := &tempUser2{} tu2 := &tempUser2{}
_, err = testEngine.Get(tu2) _, err = testEngine.Get(tu2)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
tu3 := &tempUser2{tempUser{0, "extends update"}, ""} tu3 := &tempUser2{tempUser{0, "extends update"}, ""}
_, err = testEngine.ID(tu2.TempUser.Id).Update(tu3) _, err = testEngine.ID(tu2.TempUser.Id).Update(tu3)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
err = testEngine.DropTables(&tempUser4{}) err = testEngine.DropTables(&tempUser4{})
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
err = testEngine.CreateTables(&tempUser4{}) err = testEngine.CreateTables(&tempUser4{})
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
tu8 := &tempUser4{tempUser2{tempUser{0, "extends"}, "dev depart"}} tu8 := &tempUser4{tempUser2{tempUser{0, "extends"}, "dev depart"}}
_, err = testEngine.Insert(tu8) _, err = testEngine.Insert(tu8)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
tu9 := &tempUser4{} tu9 := &tempUser4{}
_, err = testEngine.Get(tu9) _, err = testEngine.Get(tu9)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
if tu9.TempUser2.TempUser.Username != tu8.TempUser2.TempUser.Username || tu9.TempUser2.Departname != tu8.TempUser2.Departname { if tu9.TempUser2.TempUser.Username != tu8.TempUser2.TempUser.Username || tu9.TempUser2.Departname != tu8.TempUser2.Departname {
err = errors.New(fmt.Sprintln("not equal for", tu8, tu9)) err = errors.New(fmt.Sprintln("not equal for", tu8, tu9))
t.Error(err) t.Error(err)
@ -125,36 +99,22 @@ func TestExtends(t *testing.T) {
tu10 := &tempUser4{tempUser2{tempUser{0, "extends update"}, ""}} tu10 := &tempUser4{tempUser2{tempUser{0, "extends update"}, ""}}
_, err = testEngine.ID(tu9.TempUser2.TempUser.Id).Update(tu10) _, err = testEngine.ID(tu9.TempUser2.TempUser.Id).Update(tu10)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
err = testEngine.DropTables(&tempUser3{}) err = testEngine.DropTables(&tempUser3{})
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
err = testEngine.CreateTables(&tempUser3{}) err = testEngine.CreateTables(&tempUser3{})
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
tu4 := &tempUser3{&tempUser{0, "extends"}, "dev depart"} tu4 := &tempUser3{&tempUser{0, "extends"}, "dev depart"}
_, err = testEngine.Insert(tu4) _, err = testEngine.Insert(tu4)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
tu5 := &tempUser3{} tu5 := &tempUser3{}
_, err = testEngine.Get(tu5) _, err = testEngine.Get(tu5)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
if tu5.Temp == nil { if tu5.Temp == nil {
err = errors.New("error get data extends") err = errors.New("error get data extends")
t.Error(err) t.Error(err)
@ -169,22 +129,12 @@ func TestExtends(t *testing.T) {
tu6 := &tempUser3{&tempUser{0, "extends update"}, ""} tu6 := &tempUser3{&tempUser{0, "extends update"}, ""}
_, err = testEngine.ID(tu5.Temp.Id).Update(tu6) _, err = testEngine.ID(tu5.Temp.Id).Update(tu6)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
users := make([]tempUser3, 0) users := make([]tempUser3, 0)
err = testEngine.Find(&users) err = testEngine.Find(&users)
if err != nil { assert.NoError(t, err)
t.Error(err) assert.EqualValues(t, 1, len(users), "error get data not 1")
panic(err)
}
if len(users) != 1 {
err = errors.New("error get data not 1")
t.Error(err)
panic(err)
}
assertSync(t, new(Userinfo), new(Userdetail)) assertSync(t, new(Userinfo), new(Userdetail))
@ -249,10 +199,7 @@ func TestExtends(t *testing.T) {
Join("LEFT", qt(ud), qt(ui)+"."+qt("detail_id")+" = "+qt(ud)+"."+qt(uiid)). Join("LEFT", qt(ud), qt(ui)+"."+qt("detail_id")+" = "+qt(ud)+"."+qt(uiid)).
NoCascade(). NoCascade().
Find(&infos2) Find(&infos2)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
fmt.Println(infos2) fmt.Println(infos2)
} }
@ -297,25 +244,16 @@ func TestExtends2(t *testing.T) {
assert.NoError(t, prepareEngine()) assert.NoError(t, prepareEngine())
err := testEngine.DropTables(&Message{}, &MessageUser{}, &MessageType{}) err := testEngine.DropTables(&Message{}, &MessageUser{}, &MessageType{})
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
err = testEngine.CreateTables(&Message{}, &MessageUser{}, &MessageType{}) err = testEngine.CreateTables(&Message{}, &MessageUser{}, &MessageType{})
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
var sender = MessageUser{Name: "sender"} var sender = MessageUser{Name: "sender"}
var receiver = MessageUser{Name: "receiver"} var receiver = MessageUser{Name: "receiver"}
var msgtype = MessageType{Name: "type"} var msgtype = MessageType{Name: "type"}
_, err = testEngine.Insert(&sender, &receiver, &msgtype) _, err = testEngine.Insert(&sender, &receiver, &msgtype)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
msg := Message{ msg := Message{
MessageBase: MessageBase{ MessageBase: MessageBase{
@ -326,15 +264,24 @@ func TestExtends2(t *testing.T) {
Uid: sender.Id, Uid: sender.Id,
ToUid: receiver.Id, ToUid: receiver.Id,
} }
session := testEngine.NewSession()
defer session.Close()
// MSSQL deny insert identity column excep declare as below
if testEngine.Dialect().DBType() == core.MSSQL { if testEngine.Dialect().DBType() == core.MSSQL {
_, err = testEngine.Exec("SET IDENTITY_INSERT message ON") err = session.Begin()
assert.NoError(t, err)
_, err = session.Exec("SET IDENTITY_INSERT message ON")
assert.NoError(t, err) assert.NoError(t, err)
} }
cnt, err := session.Insert(&msg)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
_, err = testEngine.Insert(&msg) if testEngine.Dialect().DBType() == core.MSSQL {
if err != nil { err = session.Commit()
t.Error(err) assert.NoError(t, err)
panic(err)
} }
var mapper = testEngine.GetTableMapper().Obj2Table var mapper = testEngine.GetTableMapper().Obj2Table
@ -344,23 +291,14 @@ func TestExtends2(t *testing.T) {
msgTableName := quote(testEngine.TableName(mapper("Message"), true)) msgTableName := quote(testEngine.TableName(mapper("Message"), true))
list := make([]Message, 0) list := make([]Message, 0)
err = testEngine.Table(msgTableName).Join("LEFT", []string{userTableName, "sender"}, "`sender`.`"+mapper("Id")+"`="+msgTableName+".`"+mapper("Uid")+"`"). err = session.Table(msgTableName).Join("LEFT", []string{userTableName, "sender"}, "`sender`.`"+mapper("Id")+"`="+msgTableName+".`"+mapper("Uid")+"`").
Join("LEFT", []string{userTableName, "receiver"}, "`receiver`.`"+mapper("Id")+"`="+msgTableName+".`"+mapper("ToUid")+"`"). Join("LEFT", []string{userTableName, "receiver"}, "`receiver`.`"+mapper("Id")+"`="+msgTableName+".`"+mapper("ToUid")+"`").
Join("LEFT", []string{typeTableName, "type"}, "`type`.`"+mapper("Id")+"`="+msgTableName+".`"+mapper("Id")+"`"). Join("LEFT", []string{typeTableName, "type"}, "`type`.`"+mapper("Id")+"`="+msgTableName+".`"+mapper("Id")+"`").
Find(&list) Find(&list)
assert.NoError(t, err) assert.NoError(t, err)
if len(list) != 1 { assert.EqualValues(t, 1, len(list), fmt.Sprintln("should have 1 message, got", len(list)))
err = errors.New(fmt.Sprintln("should have 1 message, got", len(list))) assert.EqualValues(t, msg.Id, list[0].Id, fmt.Sprintln("should message equal", list[0], msg))
t.Error(err)
panic(err)
}
if list[0].Id != msg.Id {
err = errors.New(fmt.Sprintln("should message equal", list[0], msg))
t.Error(err)
panic(err)
}
} }
func TestExtends3(t *testing.T) { func TestExtends3(t *testing.T) {
@ -396,13 +334,25 @@ func TestExtends3(t *testing.T) {
Uid: sender.Id, Uid: sender.Id,
ToUid: receiver.Id, ToUid: receiver.Id,
} }
session := testEngine.NewSession()
defer session.Close()
// MSSQL deny insert identity column excep declare as below
if testEngine.Dialect().DBType() == core.MSSQL { if testEngine.Dialect().DBType() == core.MSSQL {
_, err = testEngine.Exec("SET IDENTITY_INSERT message ON") err = session.Begin()
assert.NoError(t, err)
_, err = session.Exec("SET IDENTITY_INSERT message ON")
assert.NoError(t, err) assert.NoError(t, err)
} }
_, err = testEngine.Insert(&msg) _, err = session.Insert(&msg)
assert.NoError(t, err) assert.NoError(t, err)
if testEngine.Dialect().DBType() == core.MSSQL {
err = session.Commit()
assert.NoError(t, err)
}
var mapper = testEngine.GetTableMapper().Obj2Table var mapper = testEngine.GetTableMapper().Obj2Table
var quote = testEngine.Quote var quote = testEngine.Quote
userTableName := quote(testEngine.TableName(mapper("MessageUser"), true)) userTableName := quote(testEngine.TableName(mapper("MessageUser"), true))
@ -410,7 +360,7 @@ func TestExtends3(t *testing.T) {
msgTableName := quote(testEngine.TableName(mapper("Message"), true)) msgTableName := quote(testEngine.TableName(mapper("Message"), true))
list := make([]MessageExtend3, 0) list := make([]MessageExtend3, 0)
err = testEngine.Table(msgTableName).Join("LEFT", []string{userTableName, "sender"}, "`sender`.`"+mapper("Id")+"`="+msgTableName+".`"+mapper("Uid")+"`"). err = session.Table(msgTableName).Join("LEFT", []string{userTableName, "sender"}, "`sender`.`"+mapper("Id")+"`="+msgTableName+".`"+mapper("Uid")+"`").
Join("LEFT", []string{userTableName, "receiver"}, "`receiver`.`"+mapper("Id")+"`="+msgTableName+".`"+mapper("ToUid")+"`"). Join("LEFT", []string{userTableName, "receiver"}, "`receiver`.`"+mapper("Id")+"`="+msgTableName+".`"+mapper("ToUid")+"`").
Join("LEFT", []string{typeTableName, "type"}, "`type`.`"+mapper("Id")+"`="+msgTableName+".`"+mapper("Id")+"`"). Join("LEFT", []string{typeTableName, "type"}, "`type`.`"+mapper("Id")+"`="+msgTableName+".`"+mapper("Id")+"`").
Find(&list) Find(&list)
@ -478,14 +428,23 @@ func TestExtends4(t *testing.T) {
Content: "test", Content: "test",
Uid: sender.Id, Uid: sender.Id,
} }
session := testEngine.NewSession()
defer session.Close()
// MSSQL deny insert identity column excep declare as below
if testEngine.Dialect().DBType() == core.MSSQL { if testEngine.Dialect().DBType() == core.MSSQL {
_, err = testEngine.Exec("SET IDENTITY_INSERT message ON") err = session.Begin()
assert.NoError(t, err)
_, err = session.Exec("SET IDENTITY_INSERT message ON")
assert.NoError(t, err) assert.NoError(t, err)
} }
_, err = testEngine.Insert(&msg) _, err = session.Insert(&msg)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err) if testEngine.Dialect().DBType() == core.MSSQL {
err = session.Commit()
assert.NoError(t, err)
} }
var mapper = testEngine.GetTableMapper().Obj2Table var mapper = testEngine.GetTableMapper().Obj2Table
@ -495,7 +454,7 @@ func TestExtends4(t *testing.T) {
msgTableName := quote(testEngine.TableName(mapper("Message"), true)) msgTableName := quote(testEngine.TableName(mapper("Message"), true))
list := make([]MessageExtend4, 0) list := make([]MessageExtend4, 0)
err = testEngine.Table(msgTableName).Join("LEFT", userTableName, userTableName+".`"+mapper("Id")+"`="+msgTableName+".`"+mapper("Uid")+"`"). err = session.Table(msgTableName).Join("LEFT", userTableName, userTableName+".`"+mapper("Id")+"`="+msgTableName+".`"+mapper("Uid")+"`").
Join("LEFT", typeTableName, typeTableName+".`"+mapper("Id")+"`="+msgTableName+".`"+mapper("Id")+"`"). Join("LEFT", typeTableName, typeTableName+".`"+mapper("Id")+"`="+msgTableName+".`"+mapper("Id")+"`").
Find(&list) Find(&list)
if err != nil { if err != nil {

View File

@ -1 +1 @@
go test -db=mssql -conn_str="server=192.168.1.58;user id=sa;password=123456;database=xorm_test" go test -db=mssql -conn_str="server=localhost;user id=sa;password=yourStrong(!)Password;database=xorm_test"

View File

@ -309,16 +309,24 @@ func TestCustomType2(t *testing.T) {
_, err = testEngine.Exec("delete from " + testEngine.Quote(tableName)) _, err = testEngine.Exec("delete from " + testEngine.Quote(tableName))
assert.NoError(t, err) assert.NoError(t, err)
session := testEngine.NewSession()
defer session.Close()
if testEngine.Dialect().DBType() == core.MSSQL { if testEngine.Dialect().DBType() == core.MSSQL {
return err = session.Begin()
/*_, err = engine.Exec("set IDENTITY_INSERT " + tableName + " on") assert.NoError(t, err)
if err != nil { _, err = session.Exec("set IDENTITY_INSERT " + tableName + " on")
t.Fatal(err) assert.NoError(t, err)
}*/
} }
_, err = testEngine.Insert(&UserCus{1, "xlw", Registed}) cnt, err := session.Insert(&UserCus{1, "xlw", Registed})
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
if testEngine.Dialect().DBType() == core.MSSQL {
err = session.Commit()
assert.NoError(t, err)
}
user := UserCus{} user := UserCus{}
exist, err := testEngine.ID(1).Get(&user) exist, err := testEngine.ID(1).Get(&user)