Pārlūkot izejas kodu

add Exist functions

xormplus 8 gadi atpakaļ
vecāks
revīzija
42e6c8f489
5 mainītis faili ar 195 papildinājumiem un 6 dzēšanām
  1. 24 5
      README.md
  2. 7 0
      engine.go
  3. 87 0
      session_exist.go
  4. 76 0
      session_exist_test.go
  5. 1 1
      xorm.go

+ 24 - 5
README.md

@@ -258,11 +258,11 @@ AND category. ID = 4`
 //我们可以定义一个结构体,注意:结构体中的字段名和上面执行的SQL语句字段名映射,字段数据类型正确
 //当然你还可以给这个结构体加更多其他字段,但是如果执行上面的SQL语句时,这些其他字段只会被赋值对应数据类型的零值
 type CategoryInfo struct {
-	Id             int     
-	Title          string    
-	Categoryname   string    
-	Isdraft        int       
-	Lastupdatetime time.Time 
+	Id             int
+	Title          string
+	Categoryname   string
+	Isdraft        int
+	Lastupdatetime time.Time
 }
 
 var categoryinfo []CategoryInfo
@@ -945,6 +945,25 @@ has, err := engine.Where("id = ?", id).Cols(cols...).Get(&valuesSlice)
 // SELECT col1, col2, col3 FROM user WHERE id = ?
 ```
 
+* 检测记录是否存在
+
+```Go
+has, err := testEngine.Exist(new(RecordExist))
+// SELECT * FROM record_exist LIMIT 1
+has, err = testEngine.Exist(&RecordExist{
+		Name: "test1",
+	})
+// SELECT * FROM record_exist WHERE name = ? LIMIT 1
+has, err = testEngine.Where("name = ?", "test1").Exist(&RecordExist{})
+// SELECT * FROM record_exist WHERE name = ? LIMIT 1
+has, err = testEngine.SQL("select * from record_exist where name = ?", "test1").Exist()
+// select * from record_exist where name = ?
+has, err = testEngine.Table("record_exist").Exist()
+// SELECT * FROM record_exist LIMIT 1
+has, err = testEngine.Table("record_exist").Where("name = ?", "test1").Exist()
+// SELECT * FROM record_exist WHERE name = ? LIMIT 1
+```
+
 * ORM方式查询多条记录,当然可以使用Join和extends来组合使用
 
 ```Go

+ 7 - 0
engine.go

@@ -1452,6 +1452,13 @@ func (engine *Engine) Get(bean interface{}) (bool, error) {
 	return session.Get(bean)
 }
 
+// Exist returns true if the record exist otherwise return false
+func (engine *Engine) Exist(bean ...interface{}) (bool, error) {
+	session := engine.NewSession()
+	defer session.Close()
+	return session.Exist(bean...)
+}
+
 // Find retrieve records from table, condiBeans's non-empty fields
 // are conditions. beans could be []Struct, []*Struct, map[int64]Struct
 // map[int64]*Struct

+ 87 - 0
session_exist.go

@@ -0,0 +1,87 @@
+// Copyright 2017 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package xorm
+
+import (
+	"errors"
+	"fmt"
+	"reflect"
+
+	"github.com/go-xorm/builder"
+	"github.com/xormplus/core"
+)
+
+// Exist returns true if the record exist otherwise return false
+func (session *Session) Exist(bean ...interface{}) (bool, error) {
+	defer session.resetStatement()
+	if session.IsAutoClose {
+		defer session.Close()
+	}
+
+	var sqlStr string
+	var args []interface{}
+	var err error
+
+	if session.Statement.RawSQL == "" {
+		if len(bean) == 0 {
+			tableName := session.Statement.TableName()
+			if len(tableName) <= 0 {
+				return false, ErrTableNotFound
+			}
+
+			if session.Statement.cond.IsValid() {
+				condSQL, condArgs, err := builder.ToSQL(session.Statement.cond)
+				if err != nil {
+					return false, err
+				}
+
+				sqlStr = fmt.Sprintf("SELECT * FROM %s WHERE %s LIMIT 1", tableName, condSQL)
+				args = condArgs
+			} else {
+				sqlStr = fmt.Sprintf("SELECT * FROM %s LIMIT 1", tableName)
+				args = []interface{}{}
+			}
+		} else {
+			beanValue := reflect.ValueOf(bean[0])
+			if beanValue.Kind() != reflect.Ptr {
+				return false, errors.New("needs a pointer")
+			}
+
+			if beanValue.Elem().Kind() == reflect.Struct {
+				if err := session.Statement.setRefValue(beanValue.Elem()); err != nil {
+					return false, err
+				}
+			}
+
+			if len(session.Statement.TableName()) <= 0 {
+				return false, ErrTableNotFound
+			}
+			session.Statement.Limit(1)
+			sqlStr, args, err = session.Statement.genGetSQL(bean[0])
+			if err != nil {
+				return false, err
+			}
+		}
+	} else {
+		sqlStr = session.Statement.RawSQL
+		args = session.Statement.RawParams
+	}
+
+	session.queryPreprocess(&sqlStr, args...)
+
+	var rawRows *core.Rows
+	if session.IsAutoCommit {
+		_, rawRows, err = session.innerQuery(sqlStr, args...)
+	} else {
+		rawRows, err = session.Tx.Query(sqlStr, args...)
+	}
+	if err != nil {
+		return false, err
+	}
+
+	defer rawRows.Close()
+
+	return rawRows.Next(), nil
+}

+ 76 - 0
session_exist_test.go

@@ -0,0 +1,76 @@
+// Copyright 2017 The Xorm Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package xorm
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestExistStruct(t *testing.T) {
+	assert.NoError(t, prepareEngine())
+
+	type RecordExist struct {
+		Id   int64
+		Name string
+	}
+
+	assertSync(t, new(RecordExist))
+
+	has, err := testEngine.Exist(new(RecordExist))
+	assert.NoError(t, err)
+	assert.False(t, has)
+
+	cnt, err := testEngine.Insert(&RecordExist{
+		Name: "test1",
+	})
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, cnt)
+
+	has, err = testEngine.Exist(new(RecordExist))
+	assert.NoError(t, err)
+	assert.True(t, has)
+
+	has, err = testEngine.Exist(&RecordExist{
+		Name: "test1",
+	})
+	assert.NoError(t, err)
+	assert.True(t, has)
+
+	has, err = testEngine.Exist(&RecordExist{
+		Name: "test2",
+	})
+	assert.NoError(t, err)
+	assert.False(t, has)
+
+	has, err = testEngine.Where("name = ?", "test1").Exist(&RecordExist{})
+	assert.NoError(t, err)
+	assert.True(t, has)
+
+	has, err = testEngine.Where("name = ?", "test2").Exist(&RecordExist{})
+	assert.NoError(t, err)
+	assert.False(t, has)
+
+	has, err = testEngine.SQL("select * from record_exist where name = ?", "test1").Exist()
+	assert.NoError(t, err)
+	assert.True(t, has)
+
+	has, err = testEngine.SQL("select * from record_exist where name = ?", "test2").Exist()
+	assert.NoError(t, err)
+	assert.False(t, has)
+
+	has, err = testEngine.Table("record_exist").Exist()
+	assert.NoError(t, err)
+	assert.True(t, has)
+
+	has, err = testEngine.Table("record_exist").Where("name = ?", "test1").Exist()
+	assert.NoError(t, err)
+	assert.True(t, has)
+
+	has, err = testEngine.Table("record_exist").Where("name = ?", "test2").Exist()
+	assert.NoError(t, err)
+	assert.False(t, has)
+}

+ 1 - 1
xorm.go

@@ -17,7 +17,7 @@ import (
 
 const (
 	// Version show the xorm's version
-	Version string = "0.6.2.0605"
+	Version string = "0.6.3.0713"
 )
 
 func regDrvsNDialects() bool {