|
|
@@ -14,15 +14,27 @@ import (
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
+type IDField struct {
|
|
|
+ ID string
|
|
|
+}
|
|
|
+
|
|
|
+type TimeFields struct {
|
|
|
+ CreatedTime *time.Time
|
|
|
+ LastUpdatedTime time.Time
|
|
|
+}
|
|
|
+
|
|
|
+type GraduatedTimeTestField struct {
|
|
|
+ GraduatedTimeTest *string `sqlmapping:"-" sqlresult:"column:graduated_time;parseTime:2006-01-02 15:04:05"`
|
|
|
+}
|
|
|
+
|
|
|
type Class struct {
|
|
|
- ID string
|
|
|
- Name string `sqlmapping:"updateClear;aes:@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L;" sqlresult:"aes:@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L;"`
|
|
|
- StudentNum int `sqlmapping:"column:student_num;notUpdate;" sqlresult:"column:student_num_alias"`
|
|
|
- GraduatedTime time.Time
|
|
|
- CreatedTime *time.Time
|
|
|
- LastUpdatedTime time.Time
|
|
|
- Ignored string `sqlmapping:"-" sqlresult:"-"`
|
|
|
- GraduatedTimeTest string `sqlmapping:"-" sqlresult:"column:graduated_time;parseTime:2006-01-02 15:04:05"`
|
|
|
+ IDField
|
|
|
+ Name string `sqlmapping:"updateClear;aes:@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L;" sqlresult:"aes:@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L;"`
|
|
|
+ StudentNum int `sqlmapping:"column:student_num;notUpdate;" sqlresult:"column:student_num_alias"`
|
|
|
+ GraduatedTime *time.Time
|
|
|
+ TimeFields
|
|
|
+ Ignored string `sqlmapping:"-" sqlresult:"-"`
|
|
|
+ *GraduatedTimeTestField
|
|
|
}
|
|
|
|
|
|
const (
|
|
|
@@ -338,104 +350,124 @@ func TestRawSqlTemplate(t *testing.T) {
|
|
|
}
|
|
|
|
|
|
func TestSqlMapping(t *testing.T) {
|
|
|
- sqlMapping, err := sql.ParseSqlMapping(&Class{})
|
|
|
+ checkSqlMapping(t, &Class{})
|
|
|
+}
|
|
|
+
|
|
|
+func checkSqlMapping(t *testing.T, e any) {
|
|
|
+ sqlMapping, err := sql.ParseSqlMapping(e)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
- for fieldName, sqlColumn := range sqlMapping.ColumnMap {
|
|
|
- if fieldName != "ID" && fieldName != "Name" &&
|
|
|
- fieldName != "StudentNum" && fieldName != "GraduatedTime" &&
|
|
|
- fieldName != "CreatedTime" && fieldName != "LastUpdatedTime" {
|
|
|
- t.Fatal("字段名不正确")
|
|
|
- }
|
|
|
+ for fieldName, mappingElement := range sqlMapping.MappingElement {
|
|
|
+ switch element := mappingElement.(type) {
|
|
|
+ case *sql.MappingStruct:
|
|
|
+ checkSqlMapping(t, element.FieldValueElem.Addr().Interface())
|
|
|
+ case *sql.MappingColumn:
|
|
|
+ if fieldName != "ID" && fieldName != "Name" &&
|
|
|
+ fieldName != "StudentNum" && fieldName != "GraduatedTime" &&
|
|
|
+ fieldName != "CreatedTime" && fieldName != "LastUpdatedTime" {
|
|
|
+ t.Fatal("字段名不正确")
|
|
|
+ }
|
|
|
|
|
|
- if sqlColumn.Name != "id" && sqlColumn.Name != "name" &&
|
|
|
- sqlColumn.Name != "student_num" && sqlColumn.Name != "graduated_time" &&
|
|
|
- sqlColumn.Name != "created_time" && sqlColumn.Name != "last_updated_time" {
|
|
|
- t.Fatal("列名不正确")
|
|
|
- }
|
|
|
+ if element.Name != "id" && element.Name != "name" &&
|
|
|
+ element.Name != "student_num" && element.Name != "graduated_time" &&
|
|
|
+ element.Name != "created_time" && element.Name != "last_updated_time" {
|
|
|
+ t.Fatal("列名不正确")
|
|
|
+ }
|
|
|
|
|
|
- if sqlColumn.Name != strcase.ToSnake(fieldName) {
|
|
|
- t.Fatal("列名不正确")
|
|
|
- }
|
|
|
+ if element.Name != strcase.ToSnake(fieldName) {
|
|
|
+ t.Fatal("列名不正确")
|
|
|
+ }
|
|
|
|
|
|
- if sqlColumn.Name == "id" {
|
|
|
- if !sqlColumn.IsKey || sqlColumn.CanUpdate || sqlColumn.CanUpdateClear ||
|
|
|
- strutils.IsStringNotEmpty(sqlColumn.AESKey) {
|
|
|
- t.Fatal("id字段Tag不正确")
|
|
|
+ if element.Name == "id" {
|
|
|
+ if !element.IsKey || element.CanUpdate || element.CanUpdateClear ||
|
|
|
+ strutils.IsStringNotEmpty(element.AESKey) {
|
|
|
+ t.Fatal("id字段Tag不正确")
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if sqlColumn.Name == "name" {
|
|
|
- if sqlColumn.IsKey || !sqlColumn.CanUpdate || !sqlColumn.CanUpdateClear ||
|
|
|
- strutils.IsStringEmpty(sqlColumn.AESKey) || sqlColumn.AESKey != "@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L" {
|
|
|
- t.Fatal("name字段Tag不正确")
|
|
|
+ if element.Name == "name" {
|
|
|
+ if element.IsKey || !element.CanUpdate || !element.CanUpdateClear ||
|
|
|
+ strutils.IsStringEmpty(element.AESKey) || element.AESKey != "@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L" {
|
|
|
+ t.Fatal("name字段Tag不正确")
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if sqlColumn.Name == "student_num" {
|
|
|
- if sqlColumn.IsKey || sqlColumn.CanUpdate || sqlColumn.CanUpdateClear ||
|
|
|
- strutils.IsStringNotEmpty(sqlColumn.AESKey) {
|
|
|
- t.Fatal("student_num字段Tag不正确")
|
|
|
+ if element.Name == "student_num" {
|
|
|
+ if element.IsKey || element.CanUpdate || element.CanUpdateClear ||
|
|
|
+ strutils.IsStringNotEmpty(element.AESKey) {
|
|
|
+ t.Fatal("student_num字段Tag不正确")
|
|
|
+ }
|
|
|
}
|
|
|
+ default:
|
|
|
+ t.Fatal("不支持的元素类型")
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func TestSqlResult(t *testing.T) {
|
|
|
- sqlResult, err := sql.ParseSqlResult(&Class{})
|
|
|
+ checkSqlResult(t, &Class{})
|
|
|
+}
|
|
|
+
|
|
|
+func checkSqlResult(t *testing.T, e any) {
|
|
|
+ sqlResult, err := sql.ParseSqlResult(e)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
- for fieldName, sqlColumn := range sqlResult.ColumnMap {
|
|
|
- if fieldName != "ID" && fieldName != "Name" &&
|
|
|
- fieldName != "StudentNum" && fieldName != "GraduatedTime" &&
|
|
|
- fieldName != "CreatedTime" && fieldName != "LastUpdatedTime" &&
|
|
|
- fieldName != "GraduatedTimeTest" {
|
|
|
- t.Fatal("字段名不正确")
|
|
|
- }
|
|
|
+ for fieldName, mappingElement := range sqlResult.ResultElement {
|
|
|
+ switch element := mappingElement.(type) {
|
|
|
+ case *sql.ResultStruct:
|
|
|
+ checkSqlResult(t, element.FieldValueElem.Addr().Interface())
|
|
|
+ case *sql.ResultColumn:
|
|
|
+ if fieldName != "ID" && fieldName != "Name" &&
|
|
|
+ fieldName != "StudentNum" && fieldName != "GraduatedTime" &&
|
|
|
+ fieldName != "CreatedTime" && fieldName != "LastUpdatedTime" &&
|
|
|
+ fieldName != "GraduatedTimeTest" {
|
|
|
+ t.Fatal("字段名不正确")
|
|
|
+ }
|
|
|
|
|
|
- if sqlColumn.Name != "id" && sqlColumn.Name != "name" &&
|
|
|
- sqlColumn.Name != "student_num_alias" && sqlColumn.Name != "graduated_time" &&
|
|
|
- sqlColumn.Name != "created_time" && sqlColumn.Name != "last_updated_time" &&
|
|
|
- sqlColumn.Name != "graduated_time_test" {
|
|
|
- t.Fatal("列名不正确")
|
|
|
- }
|
|
|
+ if element.Name != "id" && element.Name != "name" &&
|
|
|
+ element.Name != "student_num_alias" && element.Name != "graduated_time" &&
|
|
|
+ element.Name != "created_time" && element.Name != "last_updated_time" &&
|
|
|
+ element.Name != "graduated_time_test" {
|
|
|
+ t.Fatal("列名不正确")
|
|
|
+ }
|
|
|
|
|
|
- if sqlColumn.Name != "student_num_alias" &&
|
|
|
- sqlColumn.Name != "graduated_time" &&
|
|
|
- sqlColumn.Name != strcase.ToSnake(fieldName) {
|
|
|
- t.Fatal("列名不正确")
|
|
|
- }
|
|
|
+ if element.Name != "student_num_alias" &&
|
|
|
+ element.Name != "graduated_time" &&
|
|
|
+ element.Name != strcase.ToSnake(fieldName) {
|
|
|
+ t.Fatal("列名不正确")
|
|
|
+ }
|
|
|
|
|
|
- if sqlColumn.Name == "id" {
|
|
|
- if strutils.IsStringNotEmpty(sqlColumn.ParseTime) ||
|
|
|
- strutils.IsStringNotEmpty(sqlColumn.AESKey) {
|
|
|
- t.Fatal("id字段Tag不正确")
|
|
|
+ if element.Name == "id" {
|
|
|
+ if strutils.IsStringNotEmpty(element.ParseTime) ||
|
|
|
+ strutils.IsStringNotEmpty(element.AESKey) {
|
|
|
+ t.Fatal("id字段Tag不正确")
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if sqlColumn.Name == "name" {
|
|
|
- if strutils.IsStringNotEmpty(sqlColumn.ParseTime) ||
|
|
|
- strutils.IsStringEmpty(sqlColumn.AESKey) ||
|
|
|
- sqlColumn.AESKey != "@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L" {
|
|
|
- t.Fatal("name字段Tag不正确")
|
|
|
+ if element.Name == "name" {
|
|
|
+ if strutils.IsStringNotEmpty(element.ParseTime) ||
|
|
|
+ strutils.IsStringEmpty(element.AESKey) ||
|
|
|
+ element.AESKey != "@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L" {
|
|
|
+ t.Fatal("name字段Tag不正确")
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if sqlColumn.Name == "student_num" {
|
|
|
- if strutils.IsStringNotEmpty(sqlColumn.ParseTime) ||
|
|
|
- strutils.IsStringNotEmpty(sqlColumn.AESKey) {
|
|
|
- t.Fatal("student_num字段Tag不正确")
|
|
|
+ if element.Name == "student_num" {
|
|
|
+ if strutils.IsStringNotEmpty(element.ParseTime) ||
|
|
|
+ strutils.IsStringNotEmpty(element.AESKey) {
|
|
|
+ t.Fatal("student_num字段Tag不正确")
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if sqlColumn.Name == "graduate_time" {
|
|
|
- if strutils.IsStringEmpty(sqlColumn.ParseTime) ||
|
|
|
- strutils.IsStringNotEmpty(sqlColumn.AESKey) {
|
|
|
- t.Fatal("graduate_time字段Tag不正确")
|
|
|
+ if element.Name == "graduate_time" {
|
|
|
+ if strutils.IsStringEmpty(element.ParseTime) ||
|
|
|
+ strutils.IsStringNotEmpty(element.AESKey) {
|
|
|
+ t.Fatal("graduate_time字段Tag不正确")
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -448,6 +480,7 @@ func TestSql(t *testing.T) {
|
|
|
newClassName := strutils.SimpleUUID()
|
|
|
newStudentNum := rand.Int31n(100)
|
|
|
now := time.Now()
|
|
|
+ newNow := time.Now()
|
|
|
|
|
|
insertExecuteParams, err := sql_tpl.InsertExecuteParams{
|
|
|
TableName: tableName,
|
|
|
@@ -468,18 +501,18 @@ func TestSql(t *testing.T) {
|
|
|
}
|
|
|
|
|
|
class := &Class{
|
|
|
- ID: classID,
|
|
|
+ IDField: IDField{ID: classID},
|
|
|
Name: className,
|
|
|
StudentNum: int(studentNum),
|
|
|
- GraduatedTime: time.Now(),
|
|
|
+ GraduatedTime: &newNow,
|
|
|
Ignored: "",
|
|
|
}
|
|
|
|
|
|
newClass := &Class{
|
|
|
- ID: classID,
|
|
|
+ IDField: IDField{ID: classID},
|
|
|
Name: newClassName,
|
|
|
StudentNum: int(newStudentNum),
|
|
|
- GraduatedTime: time.Now(),
|
|
|
+ GraduatedTime: &newNow,
|
|
|
Ignored: "",
|
|
|
}
|
|
|
|