sdk_test.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. package main
  2. import (
  3. "fmt"
  4. "git.sxidc.com/go-tools/utils/strutils"
  5. "git.sxidc.com/service-supports/ds-sdk/sdk"
  6. "git.sxidc.com/service-supports/ds-sdk/sql"
  7. "git.sxidc.com/service-supports/ds-sdk/sql/sql_tpl"
  8. "github.com/iancoleman/strcase"
  9. "math/rand"
  10. "strings"
  11. "sync"
  12. "testing"
  13. "time"
  14. )
  15. type Class struct {
  16. ID string `mapstructure:"id"`
  17. Name string `sqlmapping:"updateClear;aes:@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L;" mapstructure:"name"`
  18. StudentNum int `sqlmapping:"column:student_num;notUpdate;" mapstructure:"student_num_alias"`
  19. GraduatedTime time.Time `mapstructure:"graduated_time"`
  20. CreatedTime *time.Time `mapstructure:"created_time"`
  21. LastUpdatedTime time.Time `mapstructure:"last_updated_time"`
  22. Ignored string `sqlmapping:"-" mapstructure:"-"`
  23. }
  24. const (
  25. token = "IpTTwAQweh/BP51fz5CzWKQFaXHvZe6ewvk6yOcAOkU="
  26. address = "localhost"
  27. httpPort = "10000"
  28. grpcPort = "10001"
  29. namespace = "ns-sdk-demo"
  30. dataSource = "ds-sdk-demo"
  31. deleteSql = "delete-sdk-demo"
  32. goRoutineCount = 100
  33. tableName = "test.classes"
  34. )
  35. var (
  36. sqlSpec = sdk.SqlSpec{
  37. Clauses: "- DELETE FROM {{ .table_name }} WHERE id = '{{ .id }}'",
  38. }
  39. )
  40. const (
  41. sqlResultTimeMicroFormat = "2006-01-02T15:04:05.000000+08:00"
  42. sqlResultTimeMilliFormat = "2006-01-02T15:04:05.000+08:00"
  43. sqlResultTimeSecFormat = "2006-01-02T15:04:05+08:00"
  44. )
  45. func chooseTimeLayout(timeStr string) string {
  46. if strings.HasSuffix(timeStr, ".000000+08:00") {
  47. return sqlResultTimeMicroFormat
  48. } else if strings.HasSuffix(timeStr, ".000+08:00") {
  49. return sqlResultTimeMilliFormat
  50. } else {
  51. return sqlResultTimeSecFormat
  52. }
  53. }
  54. func TestBasic(t *testing.T) {
  55. classID := strutils.SimpleUUID()
  56. className := strutils.SimpleUUID()
  57. studentNum := rand.Int31n(100)
  58. now := time.Now()
  59. insertExecuteParams, err := sql_tpl.InsertExecuteParams{
  60. TableName: tableName,
  61. TableRows: sql_tpl.NewTableRows().Add("id", classID).
  62. Add("name", className).
  63. Add("student_num", studentNum).
  64. Add("graduated_time", now).
  65. Add("created_time", now).
  66. Add("last_updated_time", now),
  67. }.Map()
  68. if err != nil {
  69. t.Fatal(err)
  70. }
  71. deleteExecuteParams := map[string]any{
  72. "table_name": tableName,
  73. "id": classID,
  74. }
  75. err = sdk.InitInstance(token, address, httpPort, grpcPort, namespace, dataSource)
  76. if err != nil {
  77. t.Fatal(err)
  78. }
  79. defer func() {
  80. err := sdk.DestroyInstance()
  81. if err != nil {
  82. t.Fatal(err)
  83. }
  84. }()
  85. err = sdk.GetInstance().CreateSQL(deleteSql, sqlSpec.ToMap())
  86. if err != nil {
  87. t.Fatal(err)
  88. }
  89. defer func() {
  90. err = sdk.GetInstance().DeleteSQL(deleteSql)
  91. if err != nil {
  92. t.Fatal(err)
  93. }
  94. }()
  95. _, err = sdk.GetInstance().ExecuteRawSql(sql_tpl.InsertTpl, insertExecuteParams)
  96. if err != nil {
  97. t.Fatal(err)
  98. }
  99. _, err = sdk.GetInstance().ExecuteSql(deleteSql, deleteExecuteParams)
  100. if err != nil {
  101. t.Fatal(err)
  102. }
  103. wg := sync.WaitGroup{}
  104. wg.Add(goRoutineCount)
  105. start := time.Now()
  106. for i := 0; i < goRoutineCount; i++ {
  107. go func() {
  108. defer wg.Done()
  109. err = sdk.GetInstance().Transaction(func(tx *sdk.Transaction) error {
  110. _, err := tx.ExecuteRawSql(sql_tpl.InsertTpl, insertExecuteParams)
  111. if err != nil {
  112. return err
  113. }
  114. _, err = tx.ExecuteSql(deleteSql, deleteExecuteParams)
  115. if err != nil {
  116. return err
  117. }
  118. return nil
  119. })
  120. if err != nil {
  121. panic(err)
  122. }
  123. }()
  124. }
  125. wg.Wait()
  126. end := time.Now()
  127. fmt.Println(end.Sub(start).Milliseconds())
  128. }
  129. func TestRawSqlTemplate(t *testing.T) {
  130. classID := strutils.SimpleUUID()
  131. className := strutils.SimpleUUID()
  132. studentNum := rand.Int31n(100)
  133. newClassName := strutils.SimpleUUID()
  134. newStudentNum := rand.Int31n(100)
  135. now := time.Now()
  136. insertExecuteParams, err := sql_tpl.InsertExecuteParams{
  137. TableName: tableName,
  138. TableRows: sql_tpl.NewTableRows().Add("id", classID).
  139. Add("name", className).
  140. Add("student_num", studentNum).
  141. Add("graduated_time", now).
  142. Add("created_time", now).
  143. Add("last_updated_time", now),
  144. }.Map()
  145. if err != nil {
  146. t.Fatal(err)
  147. }
  148. deleteExecuteParams, err := sql_tpl.DeleteExecuteParams{
  149. TableName: tableName,
  150. Conditions: sql_tpl.NewConditions().Equal("id", classID),
  151. }.Map()
  152. if err != nil {
  153. t.Fatal(err)
  154. }
  155. updateExecuteParams, err := sql_tpl.UpdateExecuteParams{
  156. TableName: tableName,
  157. TableRows: sql_tpl.NewTableRows().Add("name", newClassName).
  158. Add("student_num", newStudentNum),
  159. Conditions: sql_tpl.NewConditions().Equal("id", classID),
  160. }.Map()
  161. if err != nil {
  162. t.Fatal(err)
  163. }
  164. queryExecuteParams, err := sql_tpl.QueryExecuteParams{
  165. TableName: tableName,
  166. SelectColumns: []string{"id", "name", "student_num as student_num_alias", "graduated_time", "created_time", "last_updated_time"},
  167. Conditions: sql_tpl.NewConditions().
  168. Equal("id", classID).
  169. Equal("name", className).
  170. Equal("student_num", studentNum),
  171. PageNo: 1,
  172. PageSize: 1,
  173. }.Map()
  174. if err != nil {
  175. t.Fatal(err)
  176. }
  177. newQueryExecuteParams, err := sql_tpl.QueryExecuteParams{
  178. TableName: tableName,
  179. SelectColumns: []string{"id", "name", "student_num as student_num_alias", "graduated_time", "created_time", "last_updated_time"},
  180. Conditions: sql_tpl.NewConditions().
  181. Equal("id", classID).
  182. Equal("name", newClassName).
  183. Equal("student_num", newStudentNum),
  184. PageNo: 0,
  185. PageSize: 0,
  186. }.Map()
  187. if err != nil {
  188. t.Fatal(err)
  189. }
  190. countExecuteParams, err := sql_tpl.CountExecuteParams{
  191. TableName: tableName,
  192. Conditions: sql_tpl.NewConditions().
  193. Equal("id", classID).
  194. Equal("name", className).
  195. Equal("student_num", studentNum),
  196. }.Map()
  197. if err != nil {
  198. t.Fatal(err)
  199. }
  200. newCountExecuteParams, err := sql_tpl.CountExecuteParams{
  201. TableName: tableName,
  202. Conditions: sql_tpl.NewConditions().
  203. Equal("id", classID).
  204. Equal("name", newClassName).
  205. Equal("student_num", newStudentNum),
  206. }.Map()
  207. if err != nil {
  208. t.Fatal(err)
  209. }
  210. err = sdk.InitInstance(token, address, httpPort, grpcPort, namespace, dataSource)
  211. if err != nil {
  212. t.Fatal(err)
  213. }
  214. defer func() {
  215. err := sdk.DestroyInstance()
  216. if err != nil {
  217. t.Fatal(err)
  218. }
  219. }()
  220. _, err = sdk.GetInstance().ExecuteRawSql(sql_tpl.InsertTpl, insertExecuteParams)
  221. if err != nil {
  222. t.Fatal(err)
  223. }
  224. queryResults, err := sdk.GetInstance().ExecuteRawSql(sql_tpl.QueryTpl, queryExecuteParams)
  225. if err != nil {
  226. t.Fatal(err)
  227. }
  228. countResults, err := sdk.GetInstance().ExecuteRawSql(sql_tpl.CountTpl, countExecuteParams)
  229. if err != nil {
  230. t.Fatal(err)
  231. }
  232. classes := make([]Class, 0)
  233. err = sql.ParseSqlResults(queryResults, &classes)
  234. if err != nil {
  235. t.Fatal(err)
  236. }
  237. if float64(len(classes)) != countResults[0]["count"].(float64) {
  238. t.Fatal("总数不正确")
  239. }
  240. graduatedTimeLayout := chooseTimeLayout(queryResults[0]["graduated_time"].(string))
  241. createdTimeLayout := chooseTimeLayout(queryResults[0]["created_time"].(string))
  242. lastUpdatedTimeLayout := chooseTimeLayout(queryResults[0]["last_updated_time"].(string))
  243. if classes[0].ID != classID ||
  244. classes[0].Name != className ||
  245. classes[0].StudentNum != int(studentNum) ||
  246. classes[0].GraduatedTime.Format(graduatedTimeLayout) != now.Format(graduatedTimeLayout) ||
  247. classes[0].CreatedTime.Format(createdTimeLayout) != now.Format(createdTimeLayout) ||
  248. classes[0].LastUpdatedTime.Format(lastUpdatedTimeLayout) != now.Format(lastUpdatedTimeLayout) {
  249. t.Fatal("查询数据不正确")
  250. }
  251. _, err = sdk.GetInstance().ExecuteRawSql(sql_tpl.UpdateTpl, updateExecuteParams)
  252. if err != nil {
  253. t.Fatal(err)
  254. }
  255. queryResults, err = sdk.GetInstance().ExecuteRawSql(sql_tpl.QueryTpl, newQueryExecuteParams)
  256. if err != nil {
  257. t.Fatal(err)
  258. }
  259. countResults, err = sdk.GetInstance().ExecuteRawSql(sql_tpl.CountTpl, newCountExecuteParams)
  260. if err != nil {
  261. t.Fatal(err)
  262. }
  263. classes = make([]Class, 0)
  264. err = sql.ParseSqlResults(queryResults, &classes)
  265. if err != nil {
  266. t.Fatal(err)
  267. }
  268. if float64(len(classes)) != countResults[0]["count"].(float64) {
  269. t.Fatal("总数不正确")
  270. }
  271. graduatedTimeLayout = chooseTimeLayout(queryResults[0]["graduated_time"].(string))
  272. createdTimeLayout = chooseTimeLayout(queryResults[0]["created_time"].(string))
  273. lastUpdatedTimeLayout = chooseTimeLayout(queryResults[0]["last_updated_time"].(string))
  274. if classes[0].ID != classID ||
  275. classes[0].Name != newClassName ||
  276. classes[0].StudentNum != int(newStudentNum) ||
  277. classes[0].GraduatedTime.Format(graduatedTimeLayout) != now.Format(graduatedTimeLayout) ||
  278. classes[0].CreatedTime.Format(createdTimeLayout) != now.Format(createdTimeLayout) ||
  279. classes[0].LastUpdatedTime.Format(lastUpdatedTimeLayout) != now.Format(lastUpdatedTimeLayout) {
  280. t.Fatal("查询数据不正确")
  281. }
  282. _, err = sdk.GetInstance().ExecuteRawSql(sql_tpl.DeleteTpl, deleteExecuteParams)
  283. if err != nil {
  284. t.Fatal(err)
  285. }
  286. }
  287. func TestSqlMapping(t *testing.T) {
  288. sqlMapping, err := sql.ParseSqlMapping(&Class{})
  289. if err != nil {
  290. t.Fatal(err)
  291. }
  292. for fieldName, sqlColumn := range sqlMapping.ColumnMap {
  293. if fieldName != "ID" && fieldName != "Name" &&
  294. fieldName != "StudentNum" && fieldName != "GraduatedTime" &&
  295. fieldName != "CreatedTime" && fieldName != "LastUpdatedTime" {
  296. t.Fatal("字段名不正确")
  297. }
  298. if sqlColumn.Name != "id" && sqlColumn.Name != "name" &&
  299. sqlColumn.Name != "student_num" && sqlColumn.Name != "graduated_time" &&
  300. sqlColumn.Name != "created_time" && sqlColumn.Name != "last_updated_time" {
  301. t.Fatal("列名不正确")
  302. }
  303. if sqlColumn.Name != strcase.ToSnake(fieldName) {
  304. t.Fatal("列名不正确")
  305. }
  306. if sqlColumn.Name == "id" {
  307. if !sqlColumn.IsKey || sqlColumn.CanUpdate || sqlColumn.CanUpdateClear ||
  308. strutils.IsStringNotEmpty(sqlColumn.AESKey) {
  309. t.Fatal("id字段Tag不正确")
  310. }
  311. }
  312. if sqlColumn.Name == "name" {
  313. if sqlColumn.IsKey || !sqlColumn.CanUpdate || !sqlColumn.CanUpdateClear ||
  314. strutils.IsStringEmpty(sqlColumn.AESKey) || sqlColumn.AESKey != "@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L" {
  315. t.Fatal("name字段Tag不正确")
  316. }
  317. }
  318. if sqlColumn.Name == "student_num" {
  319. if sqlColumn.IsKey || sqlColumn.CanUpdate || sqlColumn.CanUpdateClear ||
  320. strutils.IsStringNotEmpty(sqlColumn.AESKey) {
  321. t.Fatal("student_num字段Tag不正确")
  322. }
  323. }
  324. }
  325. }
  326. func TestSql(t *testing.T) {
  327. classID := strutils.SimpleUUID()
  328. className := strutils.SimpleUUID()
  329. studentNum := rand.Int31n(100)
  330. newClassName := strutils.SimpleUUID()
  331. newStudentNum := rand.Int31n(100)
  332. now := time.Now()
  333. insertExecuteParams, err := sql_tpl.InsertExecuteParams{
  334. TableName: tableName,
  335. TableRows: sql_tpl.NewTableRows().Add("id", classID).
  336. Add("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  337. Add("student_num", studentNum).
  338. Add("graduated_time", now).
  339. Add("created_time", now).
  340. Add("last_updated_time", now),
  341. }.Map()
  342. if err != nil {
  343. t.Fatal(err)
  344. }
  345. deleteExecuteParams := map[string]any{
  346. "table_name": tableName,
  347. "id": classID,
  348. }
  349. class := &Class{
  350. ID: classID,
  351. Name: className,
  352. StudentNum: int(studentNum),
  353. GraduatedTime: time.Now(),
  354. Ignored: "",
  355. }
  356. newClass := &Class{
  357. ID: classID,
  358. Name: newClassName,
  359. StudentNum: int(newStudentNum),
  360. GraduatedTime: time.Now(),
  361. Ignored: "",
  362. }
  363. queryClasses := make([]Class, 0)
  364. queryClass := new(Class)
  365. err = sdk.InitInstance(token, address, httpPort, grpcPort, namespace, dataSource)
  366. if err != nil {
  367. t.Fatal(err)
  368. }
  369. defer func() {
  370. err := sdk.DestroyInstance()
  371. if err != nil {
  372. t.Fatal(err)
  373. }
  374. }()
  375. err = sdk.GetInstance().CreateSQL(deleteSql, sqlSpec.ToMap())
  376. if err != nil {
  377. t.Fatal(err)
  378. }
  379. defer func() {
  380. err = sdk.GetInstance().DeleteSQL(deleteSql)
  381. if err != nil {
  382. t.Fatal(err)
  383. }
  384. }()
  385. err = sql.InsertEntity(sdk.GetInstance(), tableName, class)
  386. if err != nil {
  387. t.Fatal(err)
  388. }
  389. err = sql.UpdateEntity(sdk.GetInstance(), tableName, newClass)
  390. if err != nil {
  391. t.Fatal(err)
  392. }
  393. err = sql.DeleteEntity(sdk.GetInstance(), tableName, class)
  394. if err != nil {
  395. t.Fatal(err)
  396. }
  397. err = sql.Insert(sdk.GetInstance(), &sql_tpl.InsertExecuteParams{
  398. TableName: tableName,
  399. TableRows: sql_tpl.NewTableRows().Add("id", classID).
  400. Add("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  401. Add("student_num", studentNum).
  402. Add("graduated_time", now).
  403. Add("created_time", now).
  404. Add("last_updated_time", now),
  405. })
  406. if err != nil {
  407. t.Fatal(err)
  408. }
  409. err = sql.Update(sdk.GetInstance(), &sql_tpl.UpdateExecuteParams{
  410. TableName: tableName,
  411. TableRows: sql_tpl.NewTableRows().Add("id", classID).
  412. Add("name", newClassName, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  413. Add("student_num", newStudentNum),
  414. Conditions: sql_tpl.NewConditions().
  415. Equal("id", classID),
  416. })
  417. if err != nil {
  418. t.Fatal(err)
  419. }
  420. err = sql.Delete(sdk.GetInstance(), &sql_tpl.DeleteExecuteParams{
  421. TableName: tableName,
  422. Conditions: sql_tpl.NewConditions().
  423. Equal("id", classID),
  424. })
  425. if err != nil {
  426. t.Fatal(err)
  427. }
  428. _, err = sql.ExecuteRawSql(sdk.GetInstance(), sql_tpl.InsertTpl, insertExecuteParams)
  429. if err != nil {
  430. t.Fatal(err)
  431. }
  432. _, err = sql.ExecuteSql(sdk.GetInstance(), deleteSql, deleteExecuteParams)
  433. if err != nil {
  434. t.Fatal(err)
  435. }
  436. err = sdk.GetInstance().Transaction(func(tx *sdk.Transaction) error {
  437. err = sql.InsertEntity(tx, tableName, class)
  438. if err != nil {
  439. t.Fatal(err)
  440. }
  441. err = sql.UpdateEntity(tx, tableName, newClass)
  442. if err != nil {
  443. t.Fatal(err)
  444. }
  445. err = sql.DeleteEntity(tx, tableName, class)
  446. if err != nil {
  447. t.Fatal(err)
  448. }
  449. err = sql.Insert(tx, &sql_tpl.InsertExecuteParams{
  450. TableName: tableName,
  451. TableRows: sql_tpl.NewTableRows().Add("id", classID).
  452. Add("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  453. Add("student_num", studentNum).
  454. Add("graduated_time", now).
  455. Add("created_time", now).
  456. Add("last_updated_time", now),
  457. })
  458. if err != nil {
  459. t.Fatal(err)
  460. }
  461. err = sql.Update(tx, &sql_tpl.UpdateExecuteParams{
  462. TableName: tableName,
  463. TableRows: sql_tpl.NewTableRows().Add("id", classID).
  464. Add("name", newClassName, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  465. Add("student_num", newStudentNum),
  466. Conditions: sql_tpl.NewConditions().
  467. Equal("id", classID),
  468. })
  469. if err != nil {
  470. t.Fatal(err)
  471. }
  472. err = sql.Delete(tx, &sql_tpl.DeleteExecuteParams{
  473. TableName: tableName,
  474. Conditions: sql_tpl.NewConditions().
  475. Equal("id", classID),
  476. })
  477. if err != nil {
  478. t.Fatal(err)
  479. }
  480. _, err = sql.ExecuteRawSql(tx, sql_tpl.InsertTpl, insertExecuteParams)
  481. if err != nil {
  482. t.Fatal(err)
  483. }
  484. _, err = sql.ExecuteSql(tx, deleteSql, deleteExecuteParams)
  485. if err != nil {
  486. t.Fatal(err)
  487. }
  488. return nil
  489. })
  490. if err != nil {
  491. t.Fatal(err)
  492. }
  493. err = sql.InsertEntity(sdk.GetInstance(), tableName, class)
  494. if err != nil {
  495. t.Fatal(err)
  496. }
  497. tableRows, totalCount, err := sql.Query(sdk.GetInstance(), &sql_tpl.QueryExecuteParams{
  498. TableName: tableName,
  499. SelectColumns: []string{"id", "name"},
  500. Conditions: sql_tpl.NewConditions().
  501. Equal("id", classID).
  502. Equal("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  503. Equal("student_num", studentNum),
  504. PageNo: 0,
  505. PageSize: 0,
  506. })
  507. if err != nil {
  508. t.Fatal(err)
  509. }
  510. if totalCount != 1 || len(tableRows) != int(totalCount) {
  511. t.Fatal("总数不正确")
  512. }
  513. err = sql.ParseSqlResults(tableRows, &queryClasses)
  514. if err != nil {
  515. t.Fatal(err)
  516. }
  517. if queryClasses[0].ID != classID ||
  518. queryClasses[0].Name != className ||
  519. queryClasses[0].StudentNum != 0 ||
  520. !queryClasses[0].GraduatedTime.IsZero() ||
  521. (queryClasses[0].CreatedTime != nil && !queryClasses[0].CreatedTime.IsZero()) ||
  522. !queryClasses[0].LastUpdatedTime.IsZero() {
  523. t.Fatal("查询数据不正确")
  524. }
  525. tableRow, err := sql.QueryOne(sdk.GetInstance(), &sql_tpl.QueryOneExecuteParams{
  526. TableName: tableName,
  527. SelectColumns: []string{"id", "name"},
  528. Conditions: sql_tpl.NewConditions().
  529. Equal("id", classID).
  530. Equal("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  531. Equal("student_num", studentNum),
  532. })
  533. if err != nil {
  534. t.Fatal(err)
  535. }
  536. err = sql.ParseSqlResults(tableRow, queryClass)
  537. if err != nil {
  538. t.Fatal(err)
  539. }
  540. if queryClass.ID != classID ||
  541. queryClass.Name != className ||
  542. queryClass.StudentNum != 0 ||
  543. !queryClass.GraduatedTime.IsZero() ||
  544. (queryClass.CreatedTime != nil && !queryClass.CreatedTime.IsZero()) ||
  545. !queryClass.LastUpdatedTime.IsZero() {
  546. t.Fatal("查询数据不正确")
  547. }
  548. queryCount, err := sql.Count(sdk.GetInstance(), &sql_tpl.CountExecuteParams{
  549. TableName: tableName,
  550. Conditions: sql_tpl.NewConditions().
  551. Equal("id", classID).
  552. Equal("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  553. Equal("student_num", studentNum),
  554. })
  555. if err != nil {
  556. t.Fatal(err)
  557. }
  558. if queryCount != 1 {
  559. t.Fatal("数量不正确")
  560. }
  561. exist, err := sql.CheckExist(sdk.GetInstance(), &sql_tpl.CheckExistExecuteParams{
  562. TableName: tableName,
  563. Conditions: sql_tpl.NewConditions().
  564. Equal("id", classID).
  565. Equal("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  566. Equal("student_num", studentNum),
  567. })
  568. if err != nil {
  569. t.Fatal(err)
  570. }
  571. if !exist {
  572. t.Fatal("存在状态错误")
  573. }
  574. hasOnlyOne, err := sql.CheckHasOnlyOne(sdk.GetInstance(), &sql_tpl.CheckHasOnlyOneExecuteParams{
  575. TableName: tableName,
  576. Conditions: sql_tpl.NewConditions().
  577. Equal("id", classID).
  578. Equal("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  579. Equal("student_num", studentNum),
  580. })
  581. if err != nil {
  582. t.Fatal(err)
  583. }
  584. if !hasOnlyOne {
  585. t.Fatal("唯一性错误")
  586. }
  587. err = sql.DeleteEntity(sdk.GetInstance(), tableName, class)
  588. if err != nil {
  589. t.Fatal(err)
  590. }
  591. }