add NotIn and more tests for tag (#665)

This commit is contained in:
Lunny Xiao 2017-07-27 17:48:19 +08:00 committed by GitHub
parent 60c6346a77
commit 4524e40dda
3 changed files with 127 additions and 27 deletions

View File

@ -692,6 +692,13 @@ func (engine *Engine) In(column string, args ...interface{}) *Session {
return session.In(column, args...) return session.In(column, args...)
} }
// NotIn will generate "column NOT IN (?, ?)"
func (engine *Engine) NotIn(column string, args ...interface{}) *Session {
session := engine.NewSession()
session.isAutoClose = true
return session.NotIn(column, args...)
}
// Incr provides a update string like "column = column + ?" // Incr provides a update string like "column = column + ?"
func (engine *Engine) Incr(column string, arg ...interface{}) *Session { func (engine *Engine) Incr(column string, arg ...interface{}) *Session {
session := engine.NewSession() session := engine.NewSession()

View File

@ -83,6 +83,11 @@ func TestBuilder(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, len(conds), "records should exist") assert.EqualValues(t, 1, len(conds), "records should exist")
conds = make([]Condition, 0)
err = testEngine.NotIn("col_name", "col1", "col2").Find(&conds)
assert.NoError(t, err)
assert.EqualValues(t, 0, len(conds), "records should not exist")
// complex condtions // complex condtions
var where = builder.NewCond() var where = builder.NewCond()
if true { if true {

View File

@ -110,6 +110,9 @@ func TestStrangeName(t *testing.T) {
} }
} }
func TestCreatedUpdated(t *testing.T) {
assert.NoError(t, prepareEngine())
type CreatedUpdated struct { type CreatedUpdated struct {
Id int64 Id int64
Name string Name string
@ -119,39 +122,50 @@ type CreatedUpdated struct {
Updated time.Time `xorm:"updated"` Updated time.Time `xorm:"updated"`
} }
func TestCreatedUpdated(t *testing.T) {
assert.NoError(t, prepareEngine())
err := testEngine.Sync(&CreatedUpdated{}) err := testEngine.Sync(&CreatedUpdated{})
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
c := &CreatedUpdated{Name: "test"} c := &CreatedUpdated{Name: "test"}
_, err = testEngine.Insert(c) _, err = testEngine.Insert(c)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
c2 := new(CreatedUpdated) c2 := new(CreatedUpdated)
has, err := testEngine.Id(c.Id).Get(c2) has, err := testEngine.Id(c.Id).Get(c2)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
}
if !has { assert.True(t, has)
panic(errors.New("no id"))
}
c2.Value -= 1 c2.Value -= 1
_, err = testEngine.Id(c2.Id).Update(c2) _, err = testEngine.Id(c2.Id).Update(c2)
if err != nil { assert.NoError(t, err)
t.Error(err)
panic(err)
} }
func TestCreatedUpdatedInt64(t *testing.T) {
assert.NoError(t, prepareEngine())
type CreatedUpdatedInt64 struct {
Id int64
Name string
Value float64 `xorm:"numeric"`
Created int64 `xorm:"created"`
Created2 int64 `xorm:"created"`
Updated int64 `xorm:"updated"`
}
assertSync(t, &CreatedUpdatedInt64{})
c := &CreatedUpdatedInt64{Name: "test"}
_, err := testEngine.Insert(c)
assert.NoError(t, err)
c2 := new(CreatedUpdatedInt64)
has, err := testEngine.ID(c.Id).Get(c2)
assert.NoError(t, err)
assert.True(t, has)
c2.Value -= 1
_, err = testEngine.ID(c2.Id).Update(c2)
assert.NoError(t, err)
} }
type Lowercase struct { type Lowercase struct {
@ -270,3 +284,77 @@ func TestTagComment(t *testing.T) {
assert.EqualValues(t, 1, len(tables[0].Columns())) assert.EqualValues(t, 1, len(tables[0].Columns()))
assert.EqualValues(t, "主键", tables[0].Columns()[0].Comment) assert.EqualValues(t, "主键", tables[0].Columns()[0].Comment)
} }
func TestTagDefault(t *testing.T) {
assert.NoError(t, prepareEngine())
type DefaultStruct struct {
Id int64
Name string
Age int `xorm:"default(10)"`
}
assertSync(t, new(DefaultStruct))
cnt, err := testEngine.Omit("age").Insert(&DefaultStruct{
Name: "test",
Age: 20,
})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
var s DefaultStruct
has, err := testEngine.ID(1).Get(&s)
assert.NoError(t, err)
assert.True(t, has)
assert.EqualValues(t, 10, s.Age)
assert.EqualValues(t, "test", s.Name)
}
func TestTagsDirection(t *testing.T) {
assert.NoError(t, prepareEngine())
type OnlyFromDBStruct struct {
Id int64
Name string
Uuid string `xorm:"<- default '1'"`
}
assertSync(t, new(OnlyFromDBStruct))
cnt, err := testEngine.Insert(&OnlyFromDBStruct{
Name: "test",
Uuid: "2",
})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
var s OnlyFromDBStruct
has, err := testEngine.ID(1).Get(&s)
assert.NoError(t, err)
assert.True(t, has)
assert.EqualValues(t, "1", s.Uuid)
assert.EqualValues(t, "test", s.Name)
type OnlyToDBStruct struct {
Id int64
Name string
Uuid string `xorm:"->"`
}
assertSync(t, new(OnlyToDBStruct))
cnt, err = testEngine.Insert(&OnlyToDBStruct{
Name: "test",
Uuid: "2",
})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
var s2 OnlyToDBStruct
has, err = testEngine.ID(1).Get(&s2)
assert.NoError(t, err)
assert.True(t, has)
assert.EqualValues(t, "", s2.Uuid)
assert.EqualValues(t, "test", s2.Name)
}