Explorar o código

Query add builder support

xormplus %!s(int64=7) %!d(string=hai) anos
pai
achega
3c234df6cd
Modificáronse 2 ficheiros con 58 adicións e 1 borrados
  1. 11 1
      session_query.go
  2. 47 0
      session_query_test.go

+ 11 - 1
session_query.go

@@ -17,7 +17,17 @@ import (
 
 
 func (session *Session) genQuerySQL(sqlorArgs ...interface{}) (string, []interface{}, error) {
 func (session *Session) genQuerySQL(sqlorArgs ...interface{}) (string, []interface{}, error) {
 	if len(sqlorArgs) > 0 {
 	if len(sqlorArgs) > 0 {
-		return sqlorArgs[0].(string), sqlorArgs[1:], nil
+		switch sqlorArgs[0].(type) {
+		case string:
+			return sqlorArgs[0].(string), sqlorArgs[1:], nil
+		case *builder.Builder:
+			return sqlorArgs[0].(*builder.Builder).ToSQL()
+		case builder.Builder:
+			bd := sqlorArgs[0].(builder.Builder)
+			return bd.ToSQL()
+		default:
+			return "", nil, ErrUnSupportedType
+		}
 	}
 	}
 
 
 	if session.statement.RawSQL != "" {
 	if session.statement.RawSQL != "" {

+ 47 - 0
session_query_test.go

@@ -10,6 +10,8 @@ import (
 	"testing"
 	"testing"
 	"time"
 	"time"
 
 
+	"github.com/go-xorm/builder"
+
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/assert"
 )
 )
 
 
@@ -183,3 +185,48 @@ func TestQueryNoParams(t *testing.T) {
 	assert.NoError(t, err)
 	assert.NoError(t, err)
 	assertResult(t, results)
 	assertResult(t, results)
 }
 }
+
+func TestQueryWithBuilder(t *testing.T) {
+	assert.NoError(t, prepareEngine())
+
+	type QueryWithBuilder struct {
+		Id      int64  `xorm:"autoincr pk"`
+		Msg     string `xorm:"varchar(255)"`
+		Age     int
+		Money   float32
+		Created time.Time `xorm:"created"`
+	}
+
+	testEngine.ShowSQL(true)
+
+	assert.NoError(t, testEngine.Sync2(new(QueryWithBuilder)))
+
+	var q = QueryWithBuilder{
+		Msg:   "message",
+		Age:   20,
+		Money: 3000,
+	}
+	cnt, err := testEngine.Insert(&q)
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, cnt)
+
+	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)
+		assert.NoError(t, err)
+		assert.EqualValues(t, 1, id)
+		assert.Equal(t, "message", string(results[0]["msg"]))
+
+		age, err := strconv.Atoi(string(results[0]["age"]))
+		assert.NoError(t, err)
+		assert.EqualValues(t, 20, age)
+
+		money, err := strconv.ParseFloat(string(results[0]["money"]), 32)
+		assert.NoError(t, err)
+		assert.EqualValues(t, 3000, money)
+	}
+
+	results, err := testEngine.Query(builder.Select("*").From("query_with_builder"))
+	assert.NoError(t, err)
+	assertResult(t, results)
+}