Explorar o código

修改时间精度问题

yjp hai 1 ano
pai
achega
28dfa5add8
Modificáronse 3 ficheiros con 243 adicións e 29 borrados
  1. 55 2
      sdk/raw_sql_tpl/raw_sql_tpl.go
  2. 30 8
      sdk/sql.go
  3. 158 19
      test/sdk_test.go

+ 55 - 2
sdk/raw_sql_tpl/raw_sql_tpl.go

@@ -127,6 +127,25 @@ func (params QueryExecuteParams) Map() (map[string]any, error) {
 	}, nil
 }
 
+type QueryOneExecuteParams struct {
+	TableName     string
+	SelectColumns []string
+	*Conditions
+}
+
+func (params QueryOneExecuteParams) Map() (map[string]any, error) {
+	conditions := make([]string, 0)
+	if params.Conditions != nil {
+		conditions = params.Conditions.Conditions
+	}
+
+	return map[string]any{
+		"table_name":     params.TableName,
+		"select_columns": params.SelectColumns,
+		"conditions":     conditions,
+	}, nil
+}
+
 const CountTpl = `
 SELECT
 	COUNT(*)
@@ -135,12 +154,46 @@ FROM
 WHERE
 	{{ range .conditions }} {{ . }} AND {{ end }} 1 = 1`
 
-type ConditionsExecuteParams struct {
+type CountExecuteParams struct {
+	TableName string
+	*Conditions
+}
+
+func (params CountExecuteParams) Map() (map[string]any, error) {
+	conditions := make([]string, 0)
+	if params.Conditions != nil {
+		conditions = params.Conditions.Conditions
+	}
+
+	return map[string]any{
+		"table_name": params.TableName,
+		"conditions": conditions,
+	}, nil
+}
+
+type CheckExistExecuteParams struct {
+	TableName string
+	*Conditions
+}
+
+func (params CheckExistExecuteParams) Map() (map[string]any, error) {
+	conditions := make([]string, 0)
+	if params.Conditions != nil {
+		conditions = params.Conditions.Conditions
+	}
+
+	return map[string]any{
+		"table_name": params.TableName,
+		"conditions": conditions,
+	}, nil
+}
+
+type CheckHasOnlyOneExecuteParams struct {
 	TableName string
 	*Conditions
 }
 
-func (params ConditionsExecuteParams) Map() (map[string]any, error) {
+func (params CheckHasOnlyOneExecuteParams) Map() (map[string]any, error) {
 	conditions := make([]string, 0)
 	if params.Conditions != nil {
 		conditions = params.Conditions.Conditions

+ 30 - 8
sdk/sql.go

@@ -293,7 +293,7 @@ func Query(executor SqlExecutor, executeParams *raw_sql_tpl.QueryExecuteParams)
 		return nil, 0, err
 	}
 
-	countExecuteParamsMap, err := raw_sql_tpl.ConditionsExecuteParams{
+	countExecuteParamsMap, err := raw_sql_tpl.CountExecuteParams{
 		TableName:  executeParams.TableName,
 		Conditions: executeParams.Conditions,
 	}.Map()
@@ -314,7 +314,7 @@ func Query(executor SqlExecutor, executeParams *raw_sql_tpl.QueryExecuteParams)
 	return tableRows, int64(countTableRow[0]["count"].(float64)), nil
 }
 
-func QueryOne(executor SqlExecutor, executeParams *raw_sql_tpl.QueryExecuteParams) (map[string]any, error) {
+func QueryOne(executor SqlExecutor, executeParams *raw_sql_tpl.QueryOneExecuteParams) (map[string]any, error) {
 	if executor == nil {
 		return nil, errors.New("没有传递执行器")
 	}
@@ -340,7 +340,7 @@ func QueryOne(executor SqlExecutor, executeParams *raw_sql_tpl.QueryExecuteParam
 	return tableRows[0], nil
 }
 
-func Count(executor SqlExecutor, executeParams *raw_sql_tpl.ConditionsExecuteParams) (int64, error) {
+func Count(executor SqlExecutor, executeParams *raw_sql_tpl.CountExecuteParams) (int64, error) {
 	if executor == nil {
 		return 0, errors.New("没有传递执行器")
 	}
@@ -362,7 +362,7 @@ func Count(executor SqlExecutor, executeParams *raw_sql_tpl.ConditionsExecutePar
 	return int64(tableRows[0]["count"].(float64)), nil
 }
 
-func CheckExist(executor SqlExecutor, executeParams *raw_sql_tpl.ConditionsExecuteParams) (bool, error) {
+func CheckExist(executor SqlExecutor, executeParams *raw_sql_tpl.CheckExistExecuteParams) (bool, error) {
 	if executor == nil {
 		return false, errors.New("没有传递执行器")
 	}
@@ -384,7 +384,7 @@ func CheckExist(executor SqlExecutor, executeParams *raw_sql_tpl.ConditionsExecu
 	return int64(tableRows[0]["count"].(float64)) > 0, nil
 }
 
-func CheckHasOnlyOne(executor SqlExecutor, executeParams *raw_sql_tpl.ConditionsExecuteParams) (bool, error) {
+func CheckHasOnlyOne(executor SqlExecutor, executeParams *raw_sql_tpl.CheckHasOnlyOneExecuteParams) (bool, error) {
 	if executor == nil {
 		return false, errors.New("没有传递执行器")
 	}
@@ -441,13 +441,35 @@ func ExecuteSql(executor SqlExecutor, name string, executeParams map[string]any)
 }
 
 const (
-	sqlResultTimeFormat = "2006-01-02T15:04:05.000000+08:00"
+	sqlResultTimeMicroFormat = "2006-01-02T15:04:05.000000+08:00"
+	sqlResultTimeMilliFormat = "2006-01-02T15:04:05.000+08:00"
+	sqlResultTimeSecFormat   = "2006-01-02T15:04:05+08:00"
 )
 
 func ParseSqlResults(results any, e any) error {
 	decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
-		DecodeHook: mapstructure.StringToTimeHookFunc(sqlResultTimeFormat),
-		Result:     e,
+		DecodeHook: func(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) {
+			if f.Kind() != reflect.String {
+				return data, nil
+			}
+
+			if t != reflect.TypeOf(time.Time{}) {
+				return data, nil
+			}
+
+			var layout string
+			timeStr := data.(string)
+			if strings.HasSuffix(timeStr, ".000000+08:00") {
+				layout = sqlResultTimeMicroFormat
+			} else if strings.HasSuffix(timeStr, ".000+08:00") {
+				layout = sqlResultTimeMilliFormat
+			} else {
+				layout = sqlResultTimeSecFormat
+			}
+
+			return time.ParseInLocation(layout, data.(string), time.Local)
+		},
+		Result: e,
 	})
 	if err != nil {
 		return err

+ 158 - 19
test/sdk_test.go

@@ -8,6 +8,7 @@ import (
 	"git.sxidc.com/service-supports/ds-sdk/sdk/tag"
 	"github.com/iancoleman/strcase"
 	"math/rand"
+	"strings"
 	"sync"
 	"testing"
 	"time"
@@ -24,16 +25,15 @@ type Class struct {
 }
 
 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"
-	sqlResultTimeFormat = "2006-01-02T15:04:05.000000+08:00"
+	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 (
@@ -42,6 +42,22 @@ var (
 	}
 )
 
+const (
+	sqlResultTimeMicroFormat = "2006-01-02T15:04:05.000000+08:00"
+	sqlResultTimeMilliFormat = "2006-01-02T15:04:05.000+08:00"
+	sqlResultTimeSecFormat   = "2006-01-02T15:04:05+08:00"
+)
+
+func chooseTimeLayout(timeStr string) string {
+	if strings.HasSuffix(timeStr, ".000000+08:00") {
+		return sqlResultTimeMicroFormat
+	} else if strings.HasSuffix(timeStr, ".000+08:00") {
+		return sqlResultTimeMilliFormat
+	} else {
+		return sqlResultTimeSecFormat
+	}
+}
+
 func TestBasic(t *testing.T) {
 	classID := strutils.SimpleUUID()
 	className := strutils.SimpleUUID()
@@ -143,7 +159,6 @@ func TestRawSqlTemplate(t *testing.T) {
 	newStudentNum := rand.Int31n(100)
 
 	now := time.Now()
-	exceptedNowStr := now.Format(sqlResultTimeFormat)
 
 	insertExecuteParams, err := raw_sql_tpl.InsertExecuteParams{
 		TableName: tableName,
@@ -204,7 +219,7 @@ func TestRawSqlTemplate(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	countExecuteParams, err := raw_sql_tpl.ConditionsExecuteParams{
+	countExecuteParams, err := raw_sql_tpl.CountExecuteParams{
 		TableName: tableName,
 		Conditions: raw_sql_tpl.NewConditions().
 			Equal("id", classID).
@@ -215,7 +230,7 @@ func TestRawSqlTemplate(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	newCountExecuteParams, err := raw_sql_tpl.ConditionsExecuteParams{
+	newCountExecuteParams, err := raw_sql_tpl.CountExecuteParams{
 		TableName: tableName,
 		Conditions: raw_sql_tpl.NewConditions().
 			Equal("id", classID).
@@ -263,12 +278,16 @@ func TestRawSqlTemplate(t *testing.T) {
 		t.Fatal("总数不正确")
 	}
 
+	graduatedTimeLayout := chooseTimeLayout(queryResults[0]["graduated_time"].(string))
+	createdTimeLayout := chooseTimeLayout(queryResults[0]["created_time"].(string))
+	lastUpdatedTimeLayout := chooseTimeLayout(queryResults[0]["last_updated_time"].(string))
+
 	if classes[0].ID != classID ||
 		classes[0].Name != className ||
 		classes[0].StudentNum != int(studentNum) ||
-		classes[0].GraduatedTime.Format(sqlResultTimeFormat) != exceptedNowStr ||
-		classes[0].CreatedTime.Format(sqlResultTimeFormat) != exceptedNowStr ||
-		classes[0].LastUpdatedTime.Format(sqlResultTimeFormat) != exceptedNowStr {
+		classes[0].GraduatedTime.Format(graduatedTimeLayout) != now.Format(graduatedTimeLayout) ||
+		classes[0].CreatedTime.Format(createdTimeLayout) != now.Format(createdTimeLayout) ||
+		classes[0].LastUpdatedTime.Format(lastUpdatedTimeLayout) != now.Format(lastUpdatedTimeLayout) {
 		t.Fatal("查询数据不正确")
 	}
 
@@ -297,12 +316,16 @@ func TestRawSqlTemplate(t *testing.T) {
 		t.Fatal("总数不正确")
 	}
 
+	graduatedTimeLayout = chooseTimeLayout(queryResults[0]["graduated_time"].(string))
+	createdTimeLayout = chooseTimeLayout(queryResults[0]["created_time"].(string))
+	lastUpdatedTimeLayout = chooseTimeLayout(queryResults[0]["last_updated_time"].(string))
+
 	if classes[0].ID != classID ||
 		classes[0].Name != newClassName ||
 		classes[0].StudentNum != int(newStudentNum) ||
-		classes[0].GraduatedTime.Format(sqlResultTimeFormat) != exceptedNowStr ||
-		classes[0].CreatedTime.Format(sqlResultTimeFormat) != exceptedNowStr ||
-		classes[0].LastUpdatedTime.Format(sqlResultTimeFormat) != exceptedNowStr {
+		classes[0].GraduatedTime.Format(graduatedTimeLayout) != now.Format(graduatedTimeLayout) ||
+		classes[0].CreatedTime.Format(createdTimeLayout) != now.Format(createdTimeLayout) ||
+		classes[0].LastUpdatedTime.Format(lastUpdatedTimeLayout) != now.Format(lastUpdatedTimeLayout) {
 		t.Fatal("查询数据不正确")
 	}
 
@@ -391,6 +414,9 @@ func TestSql(t *testing.T) {
 		Ignored:       "",
 	}
 
+	queryClasses := make([]Class, 0)
+	queryClass := new(Class)
+
 	err = sdk.InitInstance(token, address, httpPort, grpcPort, namespace, dataSource)
 	if err != nil {
 		t.Fatal(err)
@@ -539,4 +565,117 @@ func TestSql(t *testing.T) {
 	if err != nil {
 		t.Fatal(err)
 	}
+
+	err = sdk.InsertEntity(sdk.GetInstance(), tableName, class)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	tableRows, totalCount, err := sdk.Query(sdk.GetInstance(), &raw_sql_tpl.QueryExecuteParams{
+		TableName:     tableName,
+		SelectColumns: []string{"id", "name"},
+		Conditions: raw_sql_tpl.NewConditions().
+			Equal("id", classID).
+			Equal("name", className).
+			Equal("student_num", studentNum),
+		PageNo:   0,
+		PageSize: 0,
+	})
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if totalCount != 1 || len(tableRows) != int(totalCount) {
+		t.Fatal("总数不正确")
+	}
+
+	err = sdk.ParseSqlResults(tableRows, &queryClasses)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if queryClasses[0].ID != classID ||
+		queryClasses[0].Name != className ||
+		queryClasses[0].StudentNum != 0 ||
+		!queryClasses[0].GraduatedTime.IsZero() ||
+		(queryClasses[0].CreatedTime != nil && !queryClasses[0].CreatedTime.IsZero()) ||
+		!queryClasses[0].LastUpdatedTime.IsZero() {
+		t.Fatal("查询数据不正确")
+	}
+
+	tableRow, err := sdk.QueryOne(sdk.GetInstance(), &raw_sql_tpl.QueryOneExecuteParams{
+		TableName:     tableName,
+		SelectColumns: []string{"id", "name"},
+		Conditions: raw_sql_tpl.NewConditions().
+			Equal("id", classID).
+			Equal("name", className).
+			Equal("student_num", studentNum),
+	})
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	err = sdk.ParseSqlResults(tableRow, queryClass)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if queryClass.ID != classID ||
+		queryClass.Name != className ||
+		queryClass.StudentNum != 0 ||
+		!queryClass.GraduatedTime.IsZero() ||
+		(queryClass.CreatedTime != nil && !queryClass.CreatedTime.IsZero()) ||
+		!queryClass.LastUpdatedTime.IsZero() {
+		t.Fatal("查询数据不正确")
+	}
+
+	queryCount, err := sdk.Count(sdk.GetInstance(), &raw_sql_tpl.CountExecuteParams{
+		TableName: tableName,
+		Conditions: raw_sql_tpl.NewConditions().
+			Equal("id", classID).
+			Equal("name", className).
+			Equal("student_num", studentNum),
+	})
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if queryCount != 1 {
+		t.Fatal("数量不正确")
+	}
+
+	exist, err := sdk.CheckExist(sdk.GetInstance(), &raw_sql_tpl.CheckExistExecuteParams{
+		TableName: tableName,
+		Conditions: raw_sql_tpl.NewConditions().
+			Equal("id", classID).
+			Equal("name", className).
+			Equal("student_num", studentNum),
+	})
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if !exist {
+		t.Fatal("存在状态错误")
+	}
+
+	hasOnlyOne, err := sdk.CheckHasOnlyOne(sdk.GetInstance(), &raw_sql_tpl.CheckHasOnlyOneExecuteParams{
+		TableName: tableName,
+		Conditions: raw_sql_tpl.NewConditions().
+			Equal("id", classID).
+			Equal("name", className).
+			Equal("student_num", studentNum),
+	})
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if !hasOnlyOne {
+		t.Fatal("唯一性错误")
+	}
+
+	err = sdk.DeleteEntity(sdk.GetInstance(), tableName, class)
+	if err != nil {
+		t.Fatal(err)
+	}
 }