diff --git a/session_query.go b/session_query.go index 5b4e0dc4..f8098f84 100644 --- a/session_query.go +++ b/session_query.go @@ -17,7 +17,17 @@ import ( func (session *Session) genQuerySQL(sqlorArgs ...interface{}) (string, []interface{}, error) { 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 != "" { diff --git a/session_query_test.go b/session_query_test.go index e84a7142..1e556453 100644 --- a/session_query_test.go +++ b/session_query_test.go @@ -10,6 +10,8 @@ import ( "testing" "time" + "github.com/go-xorm/builder" + "github.com/stretchr/testify/assert" ) @@ -183,3 +185,48 @@ func TestQueryNoParams(t *testing.T) { assert.NoError(t, err) 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) +} \ No newline at end of file