Browse Source

完成raw sql模板编排

yjp 1 year ago
parent
commit
9393af8361
6 changed files with 687 additions and 197 deletions
  1. 0 109
      demo/demo.go
  2. 250 0
      sdk/raw_sql_tpl/raw_sql_tpl.go
  3. 0 88
      sdk/sdk.go
  4. 93 0
      sdk/transaction.go
  5. 0 0
      test/resources.yaml
  6. 344 0
      test/sdk_test.go

+ 0 - 109
demo/demo.go

@@ -1,109 +0,0 @@
-package main
-
-import (
-	"fmt"
-	"git.sxidc.com/go-tools/utils/strutils"
-	"git.sxidc.com/service-supports/ds-sdk/sdk"
-	"math/rand"
-	"sync"
-	"time"
-)
-
-const (
-	token          = "IpTTwAQweh/BP51fz5CzWKQFaXHvZe6ewvk6yOcAOkU="
-	address        = "localhost"
-	httpPort       = "10000"
-	grpcPort       = "10001"
-	namespace      = "ns-sdk-demo"
-	dataSource     = "ds-sdk-demo"
-	deleteSql      = "delete-sdk-demo"
-	goRoutineCount = 100
-)
-
-const (
-	sqlInsertTpl = "INSERT INTO test.classes (id, name, student_num) VALUES ('[[ .id ]]', '[[ .name ]]', [[ .student_num ]])"
-)
-
-var (
-	sqlSpec = sdk.SqlSpec{
-		Transaction: false,
-		Clauses:     "- DELETE FROM test.classes WHERE id = '{{ .id }}'",
-	}
-)
-
-func main() {
-	classID := strutils.SimpleUUID()
-	className := strutils.SimpleUUID()
-	studentNum := rand.Int31n(100)
-
-	insertExecuteParams := map[string]any{
-		"id":          classID,
-		"name":        className,
-		"student_num": studentNum,
-	}
-
-	deleteExecuteParams := map[string]any{
-		"id": classID,
-	}
-
-	err := sdk.InitInstance(token, address, httpPort, grpcPort, namespace, dataSource)
-	if err != nil {
-		panic(err)
-	}
-
-	defer func() {
-		err := sdk.DestroyInstance()
-		if err != nil {
-			panic(err)
-		}
-	}()
-
-	err = sdk.GetInstance().CreateSQL(deleteSql, sqlSpec.ToMap())
-	if err != nil {
-		panic(err)
-	}
-
-	_, err = sdk.GetInstance().ExecuteRawSql(sqlInsertTpl, insertExecuteParams)
-	if err != nil {
-		panic(err)
-	}
-
-	_, err = sdk.GetInstance().ExecuteSql(deleteSql, deleteExecuteParams)
-	if err != nil {
-		panic(err)
-	}
-
-	wg := sync.WaitGroup{}
-	wg.Add(goRoutineCount)
-
-	start := time.Now()
-
-	for i := 0; i < goRoutineCount; i++ {
-		go func() {
-			defer wg.Done()
-
-			err = sdk.GetInstance().Transaction(func(tx *sdk.Transaction) error {
-				err := tx.ExecuteRawSql(sqlInsertTpl, insertExecuteParams)
-				if err != nil {
-					return err
-				}
-
-				err = tx.ExecuteSql(deleteSql, deleteExecuteParams)
-				if err != nil {
-					return err
-				}
-
-				return nil
-			})
-			if err != nil {
-				panic(err)
-			}
-		}()
-	}
-
-	wg.Wait()
-
-	end := time.Now()
-
-	fmt.Println(end.Sub(start).Milliseconds())
-}

+ 250 - 0
sdk/raw_sql_tpl/raw_sql_tpl.go

@@ -0,0 +1,250 @@
+package raw_sql_tpl
+
+import (
+	"errors"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"github.com/fatih/structs"
+)
+
+type TableRow struct {
+	Column string `structs:"column"`
+	Value  string `structs:"value"`
+}
+
+func (tableRow TableRow) check() error {
+	if strutils.IsStringEmpty(tableRow.Column) {
+		return errors.New("没有传递列名")
+	}
+
+	if strutils.IsStringEmpty(tableRow.Value) {
+		return errors.New("没有传递列值")
+	}
+
+	return nil
+}
+
+type Condition struct {
+	Column   string `structs:"column"`
+	Operator string `structs:"operator"`
+	Value    string `structs:"value"`
+}
+
+func (cond Condition) check() error {
+	if strutils.IsStringEmpty(cond.Column) {
+		return errors.New("没有传递列名")
+	}
+
+	if strutils.IsStringEmpty(cond.Value) {
+		return errors.New("没有传递列值")
+	}
+
+	return nil
+}
+
+const InsertTpl = `
+INSERT INTO
+    {{ .table_name }} ({{ .columns | join "," }})
+VALUES
+	({{ .values | join "," }})
+`
+
+type InsertExecuteParams struct {
+	TableName string
+	TableRows []TableRow
+}
+
+func (params InsertExecuteParams) check() error {
+	if strutils.IsStringEmpty(params.TableName) {
+		return errors.New("没有传递表名")
+	}
+
+	if params.TableRows == nil || len(params.TableRows) == 0 {
+		return errors.New("没有传递行数据")
+	}
+
+	for _, tableRow := range params.TableRows {
+		if err := tableRow.check(); err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (params InsertExecuteParams) Map() (map[string]any, error) {
+	if err := params.check(); err != nil {
+		return nil, err
+	}
+
+	columns := make([]string, 0)
+	values := make([]string, 0)
+	for _, tableRow := range params.TableRows {
+		columns = append(columns, tableRow.Column)
+		values = append(values, tableRow.Value)
+	}
+
+	return map[string]any{
+		"table_name": params.TableName,
+		"columns":    columns,
+		"values":     values,
+	}, nil
+}
+
+const DeleteTpl = `
+DELETE FROM
+	{{ .table_name }}
+WHERE
+	{{ range .conditions }} {{ .column }} {{ if .operator }}{{ .operator }}{{ else }}={{ end }} {{ .value }} AND {{ end }} 1 = 1
+`
+
+type DeleteExecuteParams struct {
+	TableName  string      `structs:"table_name"`
+	Conditions []Condition `structs:"conditions"`
+}
+
+func (params DeleteExecuteParams) check() error {
+	if strutils.IsStringEmpty(params.TableName) {
+		return errors.New("没有传递表名")
+	}
+
+	if params.Conditions == nil || len(params.Conditions) == 0 {
+		return errors.New("没有传递条件")
+	}
+
+	for _, condition := range params.Conditions {
+		if err := condition.check(); err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (params DeleteExecuteParams) Map() (map[string]any, error) {
+	if err := params.check(); err != nil {
+		return nil, err
+	}
+
+	return structs.Map(params), nil
+}
+
+const UpdateTpl = `
+{{- $setList := list -}}
+{{- range .table_rows -}}
+{{- $set := printf "%s = %s" .column .value -}}
+{{- $setList = append $setList $set -}}
+{{- end }}
+
+UPDATE
+	{{ .table_name }}
+SET
+	{{ $setList | join "," }}
+WHERE
+	{{ range .conditions }} {{ .column }} {{ if .operator }}{{ .operator }}{{ else }}={{ end }} {{ .value }} AND {{ end }} 1 = 1
+`
+
+type UpdateExecuteParams struct {
+	TableName  string      `structs:"table_name"`
+	TableRows  []TableRow  `structs:"table_rows"`
+	Conditions []Condition `structs:"conditions"`
+}
+
+func (params UpdateExecuteParams) check() error {
+	if strutils.IsStringEmpty(params.TableName) {
+		return errors.New("没有传递表名")
+	}
+
+	if params.TableRows == nil || len(params.TableRows) == 0 {
+		return errors.New("没有传递表行")
+	}
+
+	for _, tableRow := range params.TableRows {
+		if err := tableRow.check(); err != nil {
+			return err
+		}
+	}
+
+	if params.Conditions == nil || len(params.Conditions) == 0 {
+		return errors.New("没有传递条件")
+	}
+
+	for _, condition := range params.Conditions {
+		if err := condition.check(); err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (params UpdateExecuteParams) Map() (map[string]any, error) {
+	if err := params.check(); err != nil {
+		return nil, err
+	}
+
+	return structs.Map(params), nil
+}
+
+const QueryTpl = `
+SELECT
+	{{ if .select_columns }}{{ .select_columns | join "," }}{{ else }}*{{ end }} 
+FROM
+	{{ .table_name }}
+WHERE
+	{{ range .conditions }} {{ .column }} {{ if .operator }}{{ .operator }}{{ else }}={{ end }} {{ .value }} AND {{ end }} 1 = 1 
+{{ if .limit }}LIMIT {{ .limit }}{{ end }}
+{{ if .offset }}OFFSET {{ .offset }}{{ end }}
+`
+
+type QueryExecuteParams struct {
+	TableName     string      `structs:"table_name"`
+	SelectColumns []string    `structs:"select_columns"`
+	Conditions    []Condition `structs:"conditions"`
+	Limit         int         `structs:"limit"`
+	Offset        int         `structs:"offset"`
+}
+
+func (params QueryExecuteParams) check() error {
+	if strutils.IsStringEmpty(params.TableName) {
+		return errors.New("没有传递表名")
+	}
+
+	return nil
+}
+
+func (params QueryExecuteParams) Map() (map[string]any, error) {
+	if err := params.check(); err != nil {
+		return nil, err
+	}
+
+	return structs.Map(params), nil
+}
+
+const CountTpl = `
+SELECT
+	COUNT(*)
+FROM
+	{{ .table_name }}
+WHERE
+	{{ range .conditions }} {{ .column }} {{ if .operator }}{{ .operator }}{{ else }}={{ end }} {{ .value }} AND {{ end }} 1 = 1`
+
+type CountExecuteParams struct {
+	TableName  string      `structs:"table_name"`
+	Conditions []Condition `structs:"conditions"`
+}
+
+func (params CountExecuteParams) check() error {
+	if strutils.IsStringEmpty(params.TableName) {
+		return errors.New("没有传递表名")
+	}
+
+	return nil
+}
+
+func (params CountExecuteParams) Map() (map[string]any, error) {
+	if err := params.check(); err != nil {
+		return nil, err
+	}
+
+	return structs.Map(params), nil
+}

+ 0 - 88
sdk/sdk.go

@@ -1,12 +1,10 @@
 package sdk
 
 import (
-	"encoding/json"
 	"errors"
 	"git.sxidc.com/go-tools/utils/strutils"
 	"git.sxidc.com/service-supports/ds-sdk/client"
 	"git.sxidc.com/service-supports/ds-sdk/grpc_client"
-	v1 "git.sxidc.com/service-supports/ds-sdk/grpc_client/v1"
 	"git.sxidc.com/service-supports/ds-sdk/grpc_client/v1/request"
 	"io"
 )
@@ -81,92 +79,6 @@ func (s *SDK) ExecuteSql(name string, executeParams map[string]any) ([]map[strin
 	return results, nil
 }
 
-type TxFunc func(tx *Transaction) error
-
-type Transaction struct {
-	stream v1.SqlService_TransactionClient
-}
-
-func (tx *Transaction) ExecuteRawSql(sql string, executeParams map[string]any) error {
-	var retErr error
-
-	defer func() {
-		if retErr != nil {
-			innerErr := tx.stream.CloseSend()
-			if innerErr != nil {
-				panic(innerErr)
-			}
-		}
-	}()
-
-	executeParamsJsonBytes, err := json.Marshal(executeParams)
-	if err != nil {
-		retErr = err
-		return retErr
-	}
-
-	err = tx.stream.SendMsg(&request.TransactionOperation{
-		Request: &request.TransactionOperation_ExecuteRawSqlRequest{
-			ExecuteRawSqlRequest: &request.ExecuteRawSqlRequest{
-				SQL:           sql,
-				ExecuteParams: string(executeParamsJsonBytes),
-			},
-		},
-	})
-	if err != nil {
-		retErr = err
-		return retErr
-	}
-
-	_, err = tx.stream.Recv()
-	if err != nil {
-		retErr = err
-		return retErr
-	}
-
-	return nil
-}
-
-func (tx *Transaction) ExecuteSql(name string, executeParams map[string]any) error {
-	var retErr error
-
-	defer func() {
-		if retErr != nil {
-			innerErr := tx.stream.CloseSend()
-			if innerErr != nil {
-				panic(innerErr)
-			}
-		}
-	}()
-
-	executeParamsJsonBytes, err := json.Marshal(executeParams)
-	if err != nil {
-		retErr = err
-		return retErr
-	}
-
-	err = tx.stream.Send(&request.TransactionOperation{
-		Request: &request.TransactionOperation_ExecuteSqlRequest{
-			ExecuteSqlRequest: &request.ExecuteSqlRequest{
-				Name:          name,
-				ExecuteParams: string(executeParamsJsonBytes),
-			},
-		},
-	})
-	if err != nil {
-		retErr = err
-		return retErr
-	}
-
-	_, err = tx.stream.Recv()
-	if err != nil {
-		retErr = err
-		return retErr
-	}
-
-	return nil
-}
-
 func (s *SDK) Transaction(txFunc TxFunc) error {
 	stream, err := s.grpcClient.Transaction()
 	if err != nil {

+ 93 - 0
sdk/transaction.go

@@ -0,0 +1,93 @@
+package sdk
+
+import (
+	"encoding/json"
+	v1 "git.sxidc.com/service-supports/ds-sdk/grpc_client/v1"
+	"git.sxidc.com/service-supports/ds-sdk/grpc_client/v1/request"
+)
+
+type TxFunc func(tx *Transaction) error
+
+type Transaction struct {
+	stream v1.SqlService_TransactionClient
+}
+
+func (tx *Transaction) ExecuteRawSql(sql string, executeParams map[string]any) error {
+	var retErr error
+
+	defer func() {
+		if retErr != nil {
+			innerErr := tx.stream.CloseSend()
+			if innerErr != nil {
+				panic(innerErr)
+			}
+		}
+	}()
+
+	executeParamsJsonBytes, err := json.Marshal(executeParams)
+	if err != nil {
+		retErr = err
+		return retErr
+	}
+
+	err = tx.stream.SendMsg(&request.TransactionOperation{
+		Request: &request.TransactionOperation_ExecuteRawSqlRequest{
+			ExecuteRawSqlRequest: &request.ExecuteRawSqlRequest{
+				SQL:           sql,
+				ExecuteParams: string(executeParamsJsonBytes),
+			},
+		},
+	})
+	if err != nil {
+		retErr = err
+		return retErr
+	}
+
+	_, err = tx.stream.Recv()
+	if err != nil {
+		retErr = err
+		return retErr
+	}
+
+	return nil
+}
+
+func (tx *Transaction) ExecuteSql(name string, executeParams map[string]any) error {
+	var retErr error
+
+	defer func() {
+		if retErr != nil {
+			innerErr := tx.stream.CloseSend()
+			if innerErr != nil {
+				panic(innerErr)
+			}
+		}
+	}()
+
+	executeParamsJsonBytes, err := json.Marshal(executeParams)
+	if err != nil {
+		retErr = err
+		return retErr
+	}
+
+	err = tx.stream.Send(&request.TransactionOperation{
+		Request: &request.TransactionOperation_ExecuteSqlRequest{
+			ExecuteSqlRequest: &request.ExecuteSqlRequest{
+				Name:          name,
+				ExecuteParams: string(executeParamsJsonBytes),
+			},
+		},
+	})
+	if err != nil {
+		retErr = err
+		return retErr
+	}
+
+	_, err = tx.stream.Recv()
+	if err != nil {
+		retErr = err
+		return retErr
+	}
+
+	return nil
+}

+ 0 - 0
demo/resources.yaml → test/resources.yaml


+ 344 - 0
test/sdk_test.go

@@ -0,0 +1,344 @@
+package main
+
+import (
+	"fmt"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"git.sxidc.com/service-supports/ds-sdk/sdk"
+	"git.sxidc.com/service-supports/ds-sdk/sdk/raw_sql_tpl"
+	"math/rand"
+	"strconv"
+	"sync"
+	"testing"
+	"time"
+)
+
+const (
+	token          = "IpTTwAQweh/BP51fz5CzWKQFaXHvZe6ewvk6yOcAOkU="
+	address        = "localhost"
+	httpPort       = "10000"
+	grpcPort       = "10001"
+	namespace      = "ns-sdk-demo"
+	dataSource     = "ds-sdk-demo"
+	deleteSql      = "delete-sdk-demo"
+	goRoutineCount = 100
+	tableName      = "test.classes"
+)
+
+var (
+	sqlSpec = sdk.SqlSpec{
+		Clauses: "- DELETE FROM {{ .table_name }} WHERE id = '{{ .id }}'",
+	}
+)
+
+func TestBasic(t *testing.T) {
+	classID := strutils.SimpleUUID()
+	className := strutils.SimpleUUID()
+	studentNum := rand.Int31n(100)
+
+	insertExecuteParams, err := raw_sql_tpl.InsertExecuteParams{
+		TableName: tableName,
+		TableRows: []raw_sql_tpl.TableRow{
+			{
+				Column: "id",
+				Value:  "'" + classID + "'",
+			},
+			{
+				Column: "name",
+				Value:  "'" + className + "'",
+			},
+			{
+				Column: "student_num",
+				Value:  strconv.FormatInt(int64(studentNum), 10),
+			},
+		},
+	}.Map()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	deleteExecuteParams := map[string]any{
+		"table_name": tableName,
+		"id":         classID,
+	}
+
+	err = sdk.InitInstance(token, address, httpPort, grpcPort, namespace, dataSource)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	defer func() {
+		err := sdk.DestroyInstance()
+		if err != nil {
+			t.Fatal(err)
+		}
+	}()
+
+	err = sdk.GetInstance().CreateSQL(deleteSql, sqlSpec.ToMap())
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	_, err = sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.InsertTpl, insertExecuteParams)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	_, err = sdk.GetInstance().ExecuteSql(deleteSql, deleteExecuteParams)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	wg := sync.WaitGroup{}
+	wg.Add(goRoutineCount)
+
+	start := time.Now()
+
+	for i := 0; i < goRoutineCount; i++ {
+		go func() {
+			defer wg.Done()
+
+			err = sdk.GetInstance().Transaction(func(tx *sdk.Transaction) error {
+				err := tx.ExecuteRawSql(raw_sql_tpl.InsertTpl, insertExecuteParams)
+				if err != nil {
+					return err
+				}
+
+				err = tx.ExecuteSql(deleteSql, deleteExecuteParams)
+				if err != nil {
+					return err
+				}
+
+				return nil
+			})
+			if err != nil {
+				panic(err)
+			}
+		}()
+	}
+
+	wg.Wait()
+
+	end := time.Now()
+
+	fmt.Println(end.Sub(start).Milliseconds())
+}
+
+func TestRawSqlTemplate(t *testing.T) {
+	classID := strutils.SimpleUUID()
+	className := strutils.SimpleUUID()
+	studentNum := rand.Int31n(100)
+	newClassName := strutils.SimpleUUID()
+	newStudentNum := rand.Int31n(100)
+
+	insertExecuteParams, err := raw_sql_tpl.InsertExecuteParams{
+		TableName: tableName,
+		TableRows: []raw_sql_tpl.TableRow{
+			{
+				Column: "id",
+				Value:  "'" + classID + "'",
+			},
+			{
+				Column: "name",
+				Value:  "'" + className + "'",
+			},
+			{
+				Column: "student_num",
+				Value:  strconv.FormatInt(int64(studentNum), 10),
+			},
+		},
+	}.Map()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	deleteExecuteParams, err := raw_sql_tpl.DeleteExecuteParams{
+		TableName: tableName,
+		Conditions: []raw_sql_tpl.Condition{
+			{
+				Column: "id",
+				Value:  "'" + classID + "'",
+			},
+		},
+	}.Map()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	updateExecuteParams, err := raw_sql_tpl.UpdateExecuteParams{
+		TableName: tableName,
+		TableRows: []raw_sql_tpl.TableRow{
+			{
+				Column: "name",
+				Value:  "'" + newClassName + "'",
+			},
+			{
+				Column: "student_num",
+				Value:  strconv.FormatInt(int64(newStudentNum), 10),
+			},
+		},
+		Conditions: []raw_sql_tpl.Condition{
+			{
+				Column: "id",
+				Value:  "'" + classID + "'",
+			},
+		},
+	}.Map()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	queryExecuteParams, err := raw_sql_tpl.QueryExecuteParams{
+		TableName: tableName,
+		Conditions: []raw_sql_tpl.Condition{
+			{
+				Column: "id",
+				Value:  "'" + classID + "'",
+			},
+			{
+				Column: "name",
+				Value:  "'" + className + "'",
+			},
+			{
+				Column: "student_num",
+				Value:  strconv.FormatInt(int64(studentNum), 10),
+			},
+		},
+		Limit:  1,
+		Offset: 0,
+	}.Map()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	newQueryExecuteParams, err := raw_sql_tpl.QueryExecuteParams{
+		TableName: tableName,
+		Conditions: []raw_sql_tpl.Condition{
+			{
+				Column: "id",
+				Value:  "'" + classID + "'",
+			},
+			{
+				Column: "name",
+				Value:  "'" + newClassName + "'",
+			},
+			{
+				Column: "student_num",
+				Value:  strconv.FormatInt(int64(newStudentNum), 10),
+			},
+		},
+		Limit:  0,
+		Offset: 0,
+	}.Map()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	countExecuteParams, err := raw_sql_tpl.CountExecuteParams{
+		TableName: tableName,
+		Conditions: []raw_sql_tpl.Condition{
+			{
+				Column: "id",
+				Value:  "'" + classID + "'",
+			},
+			{
+				Column: "name",
+				Value:  "'" + className + "'",
+			},
+			{
+				Column: "student_num",
+				Value:  strconv.FormatInt(int64(studentNum), 10),
+			},
+		},
+	}.Map()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	newCountExecuteParams, err := raw_sql_tpl.CountExecuteParams{
+		TableName: tableName,
+		Conditions: []raw_sql_tpl.Condition{
+			{
+				Column: "id",
+				Value:  "'" + classID + "'",
+			},
+			{
+				Column: "name",
+				Value:  "'" + newClassName + "'",
+			},
+			{
+				Column: "student_num",
+				Value:  strconv.FormatInt(int64(newStudentNum), 10),
+			},
+		},
+	}.Map()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	err = sdk.InitInstance(token, address, httpPort, grpcPort, namespace, dataSource)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	defer func() {
+		err := sdk.DestroyInstance()
+		if err != nil {
+			t.Fatal(err)
+		}
+	}()
+
+	_, err = sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.InsertTpl, insertExecuteParams)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	queryResults, err := sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.QueryTpl, queryExecuteParams)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	countResults, err := sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.CountTpl, countExecuteParams)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if float64(len(queryResults)) != countResults[0]["count"].(float64) {
+		t.Fatal("总数不正确")
+	}
+
+	if queryResults[0]["id"].(string) != classID ||
+		queryResults[0]["name"].(string) != className ||
+		queryResults[0]["student_num"].(float64) != float64(studentNum) {
+		t.Fatal("查询数据不正确")
+	}
+
+	_, err = sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.UpdateTpl, updateExecuteParams)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	queryResults, err = sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.QueryTpl, newQueryExecuteParams)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	countResults, err = sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.CountTpl, newCountExecuteParams)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if float64(len(queryResults)) != countResults[0]["count"].(float64) {
+		t.Fatal("总数不正确")
+	}
+
+	if queryResults[0]["id"].(string) != classID ||
+		queryResults[0]["name"].(string) != newClassName ||
+		queryResults[0]["student_num"].(float64) != float64(newStudentNum) {
+		t.Fatal("查询数据不正确")
+	}
+
+	_, err = sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.DeleteTpl, deleteExecuteParams)
+	if err != nil {
+		t.Fatal(err)
+	}
+}