Merge branch 'master' into lunny/add_alias_table
This commit is contained in:
commit
427c898419
19
README.md
19
README.md
|
@ -245,35 +245,38 @@ for rows.Next() {
|
||||||
|
|
||||||
```Go
|
```Go
|
||||||
affected, err := engine.ID(1).Update(&user)
|
affected, err := engine.ID(1).Update(&user)
|
||||||
// UPDATE user SET ... Where id = ?
|
// UPDATE user SET ... WHERE id = ?
|
||||||
|
|
||||||
affected, err := engine.Update(&user, &User{Name:name})
|
affected, err := engine.Update(&user, &User{Name:name})
|
||||||
// UPDATE user SET ... Where name = ?
|
// UPDATE user SET ... WHERE name = ?
|
||||||
|
|
||||||
var ids = []int64{1, 2, 3}
|
var ids = []int64{1, 2, 3}
|
||||||
affected, err := engine.In("id", ids).Update(&user)
|
affected, err := engine.In("id", ids).Update(&user)
|
||||||
// UPDATE user SET ... Where id IN (?, ?, ?)
|
// UPDATE user SET ... WHERE id IN (?, ?, ?)
|
||||||
|
|
||||||
// force update indicated columns by Cols
|
// force update indicated columns by Cols
|
||||||
affected, err := engine.ID(1).Cols("age").Update(&User{Name:name, Age: 12})
|
affected, err := engine.ID(1).Cols("age").Update(&User{Name:name, Age: 12})
|
||||||
// UPDATE user SET age = ?, updated=? Where id = ?
|
// UPDATE user SET age = ?, updated=? WHERE id = ?
|
||||||
|
|
||||||
// force NOT update indicated columns by Omit
|
// force NOT update indicated columns by Omit
|
||||||
affected, err := engine.ID(1).Omit("name").Update(&User{Name:name, Age: 12})
|
affected, err := engine.ID(1).Omit("name").Update(&User{Name:name, Age: 12})
|
||||||
// UPDATE user SET age = ?, updated=? Where id = ?
|
// UPDATE user SET age = ?, updated=? WHERE id = ?
|
||||||
|
|
||||||
affected, err := engine.ID(1).AllCols().Update(&user)
|
affected, err := engine.ID(1).AllCols().Update(&user)
|
||||||
// UPDATE user SET name=?,age=?,salt=?,passwd=?,updated=? Where id = ?
|
// UPDATE user SET name=?,age=?,salt=?,passwd=?,updated=? WHERE id = ?
|
||||||
```
|
```
|
||||||
|
|
||||||
* `Delete` delete one or more records, Delete MUST have condition
|
* `Delete` delete one or more records, Delete MUST have condition
|
||||||
|
|
||||||
```Go
|
```Go
|
||||||
affected, err := engine.Where(...).Delete(&user)
|
affected, err := engine.Where(...).Delete(&user)
|
||||||
// DELETE FROM user Where ...
|
// DELETE FROM user WHERE ...
|
||||||
|
|
||||||
affected, err := engine.ID(2).Delete(&user)
|
affected, err := engine.ID(2).Delete(&user)
|
||||||
// DELETE FROM user Where id = ?
|
// DELETE FROM user WHERE id = ?
|
||||||
|
|
||||||
|
affected, err := engine.Table("user").Where(...).Delete()
|
||||||
|
// DELETE FROM user WHERE ...
|
||||||
```
|
```
|
||||||
|
|
||||||
* `Count` count records
|
* `Count` count records
|
||||||
|
|
|
@ -271,6 +271,9 @@ affected, err := engine.Where(...).Delete(&user)
|
||||||
|
|
||||||
affected, err := engine.ID(2).Delete(&user)
|
affected, err := engine.ID(2).Delete(&user)
|
||||||
// DELETE FROM user Where id = ?
|
// DELETE FROM user Where id = ?
|
||||||
|
|
||||||
|
affected, err := engine.Table("user").Where(...).Delete()
|
||||||
|
// DELETE FROM user WHERE ...
|
||||||
```
|
```
|
||||||
|
|
||||||
* `Count` 获取记录条数
|
* `Count` 获取记录条数
|
||||||
|
|
|
@ -1202,10 +1202,10 @@ func (engine *Engine) Update(bean interface{}, condiBeans ...interface{}) (int64
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete records, bean's non-empty fields are conditions
|
// Delete records, bean's non-empty fields are conditions
|
||||||
func (engine *Engine) Delete(bean interface{}) (int64, error) {
|
func (engine *Engine) Delete(beans ...interface{}) (int64, error) {
|
||||||
session := engine.NewSession()
|
session := engine.NewSession()
|
||||||
defer session.Close()
|
defer session.Close()
|
||||||
return session.Delete(bean)
|
return session.Delete(beans...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get retrieve one record from table, bean's non-empty fields
|
// Get retrieve one record from table, bean's non-empty fields
|
||||||
|
|
|
@ -241,3 +241,28 @@ func TestUnscopeDelete(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.False(t, has)
|
assert.False(t, has)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDelete2(t *testing.T) {
|
||||||
|
assert.NoError(t, PrepareEngine())
|
||||||
|
|
||||||
|
type UserinfoDelete2 struct {
|
||||||
|
Uid int64 `xorm:"id pk not null autoincr"`
|
||||||
|
IsMan bool
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.NoError(t, testEngine.Sync2(new(UserinfoDelete2)))
|
||||||
|
|
||||||
|
user := UserinfoDelete2{}
|
||||||
|
cnt, err := testEngine.Insert(&user)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, cnt)
|
||||||
|
|
||||||
|
cnt, err = testEngine.Table("userinfo_delete2").In("id", []int{1}).Delete()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, cnt)
|
||||||
|
|
||||||
|
user2 := UserinfoDelete2{}
|
||||||
|
has, err := testEngine.ID(1).Get(&user2)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.False(t, has)
|
||||||
|
}
|
||||||
|
|
|
@ -147,6 +147,30 @@ func (s *SliceType) ToDB() ([]byte, error) {
|
||||||
return json.DefaultJSONHandler.Marshal(s)
|
return json.DefaultJSONHandler.Marshal(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Nullable struct {
|
||||||
|
Data string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Nullable) FromDB(data []byte) error {
|
||||||
|
if data == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
*s = Nullable{
|
||||||
|
Data: string(data),
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Nullable) ToDB() ([]byte, error) {
|
||||||
|
if s == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return []byte(s.Data), nil
|
||||||
|
}
|
||||||
|
|
||||||
type ConvStruct struct {
|
type ConvStruct struct {
|
||||||
Conv ConvString
|
Conv ConvString
|
||||||
Conv2 *ConvString
|
Conv2 *ConvString
|
||||||
|
@ -154,6 +178,8 @@ type ConvStruct struct {
|
||||||
Cfg2 *ConvConfig `xorm:"TEXT"`
|
Cfg2 *ConvConfig `xorm:"TEXT"`
|
||||||
Cfg3 convert.Conversion `xorm:"BLOB"`
|
Cfg3 convert.Conversion `xorm:"BLOB"`
|
||||||
Slice SliceType
|
Slice SliceType
|
||||||
|
Nullable1 *Nullable `xorm:"null"`
|
||||||
|
Nullable2 *Nullable `xorm:"null"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ConvStruct) BeforeSet(name string, cell xorm.Cell) {
|
func (c *ConvStruct) BeforeSet(name string, cell xorm.Cell) {
|
||||||
|
@ -176,8 +202,10 @@ func TestConversion(t *testing.T) {
|
||||||
c.Cfg2 = &ConvConfig{"xx", 2}
|
c.Cfg2 = &ConvConfig{"xx", 2}
|
||||||
c.Cfg3 = &ConvConfig{"zz", 3}
|
c.Cfg3 = &ConvConfig{"zz", 3}
|
||||||
c.Slice = []*ConvConfig{{"yy", 4}, {"ff", 5}}
|
c.Slice = []*ConvConfig{{"yy", 4}, {"ff", 5}}
|
||||||
|
c.Nullable1 = &Nullable{Data: "test"}
|
||||||
|
c.Nullable2 = nil
|
||||||
|
|
||||||
_, err := testEngine.Insert(c)
|
_, err := testEngine.Nullable("nullable2").Insert(c)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
c1 := new(ConvStruct)
|
c1 := new(ConvStruct)
|
||||||
|
@ -219,6 +247,9 @@ func TestConversion(t *testing.T) {
|
||||||
assert.EqualValues(t, 2, len(c2.Slice))
|
assert.EqualValues(t, 2, len(c2.Slice))
|
||||||
assert.EqualValues(t, *c.Slice[0], *c2.Slice[0])
|
assert.EqualValues(t, *c.Slice[0], *c2.Slice[0])
|
||||||
assert.EqualValues(t, *c.Slice[1], *c2.Slice[1])
|
assert.EqualValues(t, *c.Slice[1], *c2.Slice[1])
|
||||||
|
assert.NotNil(t, c1.Nullable1)
|
||||||
|
assert.Equal(t, c1.Nullable1.Data, "test")
|
||||||
|
assert.Nil(t, c1.Nullable2)
|
||||||
}
|
}
|
||||||
|
|
||||||
type MyInt int
|
type MyInt int
|
||||||
|
|
|
@ -30,7 +30,7 @@ type Interface interface {
|
||||||
CreateUniques(bean interface{}) error
|
CreateUniques(bean interface{}) error
|
||||||
Decr(column string, arg ...interface{}) *Session
|
Decr(column string, arg ...interface{}) *Session
|
||||||
Desc(...string) *Session
|
Desc(...string) *Session
|
||||||
Delete(interface{}) (int64, error)
|
Delete(...interface{}) (int64, error)
|
||||||
Distinct(columns ...string) *Session
|
Distinct(columns ...string) *Session
|
||||||
DropIndexes(bean interface{}) error
|
DropIndexes(bean interface{}) error
|
||||||
Exec(sqlOrArgs ...interface{}) (sql.Result, error)
|
Exec(sqlOrArgs ...interface{}) (sql.Result, error)
|
||||||
|
@ -51,6 +51,7 @@ type Interface interface {
|
||||||
MustCols(columns ...string) *Session
|
MustCols(columns ...string) *Session
|
||||||
NoAutoCondition(...bool) *Session
|
NoAutoCondition(...bool) *Session
|
||||||
NotIn(string, ...interface{}) *Session
|
NotIn(string, ...interface{}) *Session
|
||||||
|
Nullable(...string) *Session
|
||||||
Join(joinOperator string, tablename interface{}, condition string, args ...interface{}) *Session
|
Join(joinOperator string, tablename interface{}, condition string, args ...interface{}) *Session
|
||||||
Omit(columns ...string) *Session
|
Omit(columns ...string) *Session
|
||||||
OrderBy(order string) *Session
|
OrderBy(order string) *Session
|
||||||
|
|
|
@ -83,7 +83,7 @@ func (session *Session) cacheDelete(table *schemas.Table, tableName, sqlStr stri
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete records, bean's non-empty fields are conditions
|
// Delete records, bean's non-empty fields are conditions
|
||||||
func (session *Session) Delete(bean interface{}) (int64, error) {
|
func (session *Session) Delete(beans ...interface{}) (int64, error) {
|
||||||
if session.isAutoClose {
|
if session.isAutoClose {
|
||||||
defer session.Close()
|
defer session.Close()
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,15 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
|
||||||
return 0, session.statement.LastError
|
return 0, session.statement.LastError
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := session.statement.SetRefBean(bean); err != nil {
|
var (
|
||||||
|
condSQL string
|
||||||
|
condArgs []interface{}
|
||||||
|
err error
|
||||||
|
bean interface{}
|
||||||
|
)
|
||||||
|
if len(beans) > 0 {
|
||||||
|
bean = beans[0]
|
||||||
|
if err = session.statement.SetRefBean(bean); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,10 +110,14 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
|
||||||
processor.BeforeDelete()
|
processor.BeforeDelete()
|
||||||
}
|
}
|
||||||
|
|
||||||
condSQL, condArgs, err := session.statement.GenConds(bean)
|
condSQL, condArgs, err = session.statement.GenConds(bean)
|
||||||
|
} else {
|
||||||
|
condSQL, condArgs, err = session.statement.GenCondSQL(session.statement.Conds())
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
pLimitN := session.statement.LimitN
|
pLimitN := session.statement.LimitN
|
||||||
if len(condSQL) == 0 && (pLimitN == nil || *pLimitN == 0) {
|
if len(condSQL) == 0 && (pLimitN == nil || *pLimitN == 0) {
|
||||||
return 0, ErrNeedDeletedCond
|
return 0, ErrNeedDeletedCond
|
||||||
|
@ -156,7 +168,7 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
|
||||||
|
|
||||||
var realSQL string
|
var realSQL string
|
||||||
argsForCache := make([]interface{}, 0, len(condArgs)*2)
|
argsForCache := make([]interface{}, 0, len(condArgs)*2)
|
||||||
if session.statement.GetUnscoped() || table.DeletedColumn() == nil { // tag "deleted" is disabled
|
if session.statement.GetUnscoped() || table == nil || table.DeletedColumn() == nil { // tag "deleted" is disabled
|
||||||
realSQL = deleteSQL
|
realSQL = deleteSQL
|
||||||
copy(argsForCache, condArgs)
|
copy(argsForCache, condArgs)
|
||||||
argsForCache = append(condArgs, argsForCache...)
|
argsForCache = append(condArgs, argsForCache...)
|
||||||
|
@ -220,6 +232,7 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if bean != nil {
|
||||||
// handle after delete processors
|
// handle after delete processors
|
||||||
if session.isAutoCommit {
|
if session.isAutoCommit {
|
||||||
for _, closure := range session.afterClosures {
|
for _, closure := range session.afterClosures {
|
||||||
|
@ -230,8 +243,8 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
lenAfterClosures := len(session.afterClosures)
|
lenAfterClosures := len(session.afterClosures)
|
||||||
if lenAfterClosures > 0 {
|
if lenAfterClosures > 0 && len(beans) > 0 {
|
||||||
if value, has := session.afterDeleteBeans[bean]; has && value != nil {
|
if value, has := session.afterDeleteBeans[beans[0]]; has && value != nil {
|
||||||
*value = append(*value, session.afterClosures...)
|
*value = append(*value, session.afterClosures...)
|
||||||
} else {
|
} else {
|
||||||
afterClosures := make([]func(interface{}), lenAfterClosures)
|
afterClosures := make([]func(interface{}), lenAfterClosures)
|
||||||
|
@ -244,6 +257,7 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
cleanupProcessorsClosures(&session.afterClosures)
|
cleanupProcessorsClosures(&session.afterClosures)
|
||||||
// --
|
// --
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue