sdk_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  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
  17. Name string `sqlmapping:"updateClear;aes:@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L;" sqlresult:"aes:@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L;"`
  18. StudentNum int `sqlmapping:"column:student_num;notUpdate;" sqlresult:"column:student_num_alias"`
  19. GraduatedTime time.Time
  20. CreatedTime *time.Time
  21. LastUpdatedTime time.Time
  22. Ignored string `sqlmapping:"-" sqlresult:"-"`
  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, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  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, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  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().
  158. Add("name", newClassName, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  159. Add("student_num", newStudentNum),
  160. Conditions: sql_tpl.NewConditions().Equal("id", classID),
  161. }.Map()
  162. if err != nil {
  163. t.Fatal(err)
  164. }
  165. queryExecuteParams, err := sql_tpl.QueryExecuteParams{
  166. TableName: tableName,
  167. SelectColumns: []string{"id", "name", "student_num as student_num_alias", "graduated_time", "created_time", "last_updated_time"},
  168. Conditions: sql_tpl.NewConditions().
  169. Equal("id", classID).
  170. Equal("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  171. Equal("student_num", studentNum),
  172. PageNo: 1,
  173. PageSize: 1,
  174. }.Map()
  175. if err != nil {
  176. t.Fatal(err)
  177. }
  178. newQueryExecuteParams, err := sql_tpl.QueryExecuteParams{
  179. TableName: tableName,
  180. SelectColumns: []string{"id", "name", "student_num as student_num_alias", "graduated_time", "created_time", "last_updated_time"},
  181. Conditions: sql_tpl.NewConditions().
  182. Equal("id", classID).
  183. Equal("name", newClassName, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  184. Equal("student_num", newStudentNum),
  185. PageNo: 0,
  186. PageSize: 0,
  187. }.Map()
  188. if err != nil {
  189. t.Fatal(err)
  190. }
  191. countExecuteParams, err := sql_tpl.CountExecuteParams{
  192. TableName: tableName,
  193. Conditions: sql_tpl.NewConditions().
  194. Equal("id", classID).
  195. Equal("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  196. Equal("student_num", studentNum),
  197. }.Map()
  198. if err != nil {
  199. t.Fatal(err)
  200. }
  201. newCountExecuteParams, err := sql_tpl.CountExecuteParams{
  202. TableName: tableName,
  203. Conditions: sql_tpl.NewConditions().
  204. Equal("id", classID).
  205. Equal("name", newClassName, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  206. Equal("student_num", newStudentNum),
  207. }.Map()
  208. if err != nil {
  209. t.Fatal(err)
  210. }
  211. err = sdk.InitInstance(token, address, httpPort, grpcPort, namespace, dataSource)
  212. if err != nil {
  213. t.Fatal(err)
  214. }
  215. defer func() {
  216. err := sdk.DestroyInstance()
  217. if err != nil {
  218. t.Fatal(err)
  219. }
  220. }()
  221. _, err = sdk.GetInstance().ExecuteRawSql(sql_tpl.InsertTpl, insertExecuteParams)
  222. if err != nil {
  223. t.Fatal(err)
  224. }
  225. queryResults, err := sdk.GetInstance().ExecuteRawSql(sql_tpl.QueryTpl, queryExecuteParams)
  226. if err != nil {
  227. t.Fatal(err)
  228. }
  229. countResults, err := sdk.GetInstance().ExecuteRawSql(sql_tpl.CountTpl, countExecuteParams)
  230. if err != nil {
  231. t.Fatal(err)
  232. }
  233. classes := make([]Class, 0)
  234. err = sql.ParseSqlTableRow(queryResults, &classes)
  235. if err != nil {
  236. t.Fatal(err)
  237. }
  238. if float64(len(classes)) != countResults[0]["count"].(float64) {
  239. t.Fatal("总数不正确")
  240. }
  241. graduatedTimeLayout := chooseTimeLayout(queryResults[0]["graduated_time"].(string))
  242. createdTimeLayout := chooseTimeLayout(queryResults[0]["created_time"].(string))
  243. lastUpdatedTimeLayout := chooseTimeLayout(queryResults[0]["last_updated_time"].(string))
  244. if classes[0].ID != classID ||
  245. classes[0].Name != className ||
  246. classes[0].StudentNum != int(studentNum) ||
  247. classes[0].GraduatedTime.Format(graduatedTimeLayout) != now.Format(graduatedTimeLayout) ||
  248. classes[0].CreatedTime.Format(createdTimeLayout) != now.Format(createdTimeLayout) ||
  249. classes[0].LastUpdatedTime.Format(lastUpdatedTimeLayout) != now.Format(lastUpdatedTimeLayout) {
  250. t.Fatal("查询数据不正确")
  251. }
  252. _, err = sdk.GetInstance().ExecuteRawSql(sql_tpl.UpdateTpl, updateExecuteParams)
  253. if err != nil {
  254. t.Fatal(err)
  255. }
  256. queryResults, err = sdk.GetInstance().ExecuteRawSql(sql_tpl.QueryTpl, newQueryExecuteParams)
  257. if err != nil {
  258. t.Fatal(err)
  259. }
  260. countResults, err = sdk.GetInstance().ExecuteRawSql(sql_tpl.CountTpl, newCountExecuteParams)
  261. if err != nil {
  262. t.Fatal(err)
  263. }
  264. classes = make([]Class, 0)
  265. err = sql.ParseSqlTableRow(queryResults, &classes)
  266. if err != nil {
  267. t.Fatal(err)
  268. }
  269. if float64(len(classes)) != countResults[0]["count"].(float64) {
  270. t.Fatal("总数不正确")
  271. }
  272. graduatedTimeLayout = chooseTimeLayout(queryResults[0]["graduated_time"].(string))
  273. createdTimeLayout = chooseTimeLayout(queryResults[0]["created_time"].(string))
  274. lastUpdatedTimeLayout = chooseTimeLayout(queryResults[0]["last_updated_time"].(string))
  275. if classes[0].ID != classID ||
  276. classes[0].Name != newClassName ||
  277. classes[0].StudentNum != int(newStudentNum) ||
  278. classes[0].GraduatedTime.Format(graduatedTimeLayout) != now.Format(graduatedTimeLayout) ||
  279. classes[0].CreatedTime.Format(createdTimeLayout) != now.Format(createdTimeLayout) ||
  280. classes[0].LastUpdatedTime.Format(lastUpdatedTimeLayout) != now.Format(lastUpdatedTimeLayout) {
  281. t.Fatal("查询数据不正确")
  282. }
  283. _, err = sdk.GetInstance().ExecuteRawSql(sql_tpl.DeleteTpl, deleteExecuteParams)
  284. if err != nil {
  285. t.Fatal(err)
  286. }
  287. }
  288. func TestSqlMapping(t *testing.T) {
  289. sqlMapping, err := sql.ParseSqlMapping(&Class{})
  290. if err != nil {
  291. t.Fatal(err)
  292. }
  293. for fieldName, sqlColumn := range sqlMapping.ColumnMap {
  294. if fieldName != "ID" && fieldName != "Name" &&
  295. fieldName != "StudentNum" && fieldName != "GraduatedTime" &&
  296. fieldName != "CreatedTime" && fieldName != "LastUpdatedTime" {
  297. t.Fatal("字段名不正确")
  298. }
  299. if sqlColumn.Name != "id" && sqlColumn.Name != "name" &&
  300. sqlColumn.Name != "student_num" && sqlColumn.Name != "graduated_time" &&
  301. sqlColumn.Name != "created_time" && sqlColumn.Name != "last_updated_time" {
  302. t.Fatal("列名不正确")
  303. }
  304. if sqlColumn.Name != strcase.ToSnake(fieldName) {
  305. t.Fatal("列名不正确")
  306. }
  307. if sqlColumn.Name == "id" {
  308. if !sqlColumn.IsKey || sqlColumn.CanUpdate || sqlColumn.CanUpdateClear ||
  309. strutils.IsStringNotEmpty(sqlColumn.AESKey) {
  310. t.Fatal("id字段Tag不正确")
  311. }
  312. }
  313. if sqlColumn.Name == "name" {
  314. if sqlColumn.IsKey || !sqlColumn.CanUpdate || !sqlColumn.CanUpdateClear ||
  315. strutils.IsStringEmpty(sqlColumn.AESKey) || sqlColumn.AESKey != "@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L" {
  316. t.Fatal("name字段Tag不正确")
  317. }
  318. }
  319. if sqlColumn.Name == "student_num" {
  320. if sqlColumn.IsKey || sqlColumn.CanUpdate || sqlColumn.CanUpdateClear ||
  321. strutils.IsStringNotEmpty(sqlColumn.AESKey) {
  322. t.Fatal("student_num字段Tag不正确")
  323. }
  324. }
  325. }
  326. }
  327. func TestSql(t *testing.T) {
  328. classID := strutils.SimpleUUID()
  329. className := strutils.SimpleUUID()
  330. studentNum := rand.Int31n(100)
  331. newClassName := strutils.SimpleUUID()
  332. newStudentNum := rand.Int31n(100)
  333. now := time.Now()
  334. insertExecuteParams, err := sql_tpl.InsertExecuteParams{
  335. TableName: tableName,
  336. TableRows: sql_tpl.NewTableRows().Add("id", classID).
  337. Add("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  338. Add("student_num", studentNum).
  339. Add("graduated_time", now).
  340. Add("created_time", now).
  341. Add("last_updated_time", now),
  342. }.Map()
  343. if err != nil {
  344. t.Fatal(err)
  345. }
  346. deleteExecuteParams := map[string]any{
  347. "table_name": tableName,
  348. "id": classID,
  349. }
  350. class := &Class{
  351. ID: classID,
  352. Name: className,
  353. StudentNum: int(studentNum),
  354. GraduatedTime: time.Now(),
  355. Ignored: "",
  356. }
  357. newClass := &Class{
  358. ID: classID,
  359. Name: newClassName,
  360. StudentNum: int(newStudentNum),
  361. GraduatedTime: time.Now(),
  362. Ignored: "",
  363. }
  364. queryClasses := make([]Class, 0)
  365. queryClass := new(Class)
  366. err = sdk.InitInstance(token, address, httpPort, grpcPort, namespace, dataSource)
  367. if err != nil {
  368. t.Fatal(err)
  369. }
  370. defer func() {
  371. err := sdk.DestroyInstance()
  372. if err != nil {
  373. t.Fatal(err)
  374. }
  375. }()
  376. err = sdk.GetInstance().CreateSQL(deleteSql, sqlSpec.ToMap())
  377. if err != nil {
  378. t.Fatal(err)
  379. }
  380. defer func() {
  381. err = sdk.GetInstance().DeleteSQL(deleteSql)
  382. if err != nil {
  383. t.Fatal(err)
  384. }
  385. }()
  386. err = sql.InsertEntity(sdk.GetInstance(), tableName, class)
  387. if err != nil {
  388. t.Fatal(err)
  389. }
  390. err = sql.UpdateEntity(sdk.GetInstance(), tableName, newClass)
  391. if err != nil {
  392. t.Fatal(err)
  393. }
  394. err = sql.DeleteEntity(sdk.GetInstance(), tableName, class)
  395. if err != nil {
  396. t.Fatal(err)
  397. }
  398. err = sql.Insert(sdk.GetInstance(), &sql_tpl.InsertExecuteParams{
  399. TableName: tableName,
  400. TableRows: sql_tpl.NewTableRows().Add("id", classID).
  401. Add("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  402. Add("student_num", studentNum).
  403. Add("graduated_time", now).
  404. Add("created_time", now).
  405. Add("last_updated_time", now),
  406. })
  407. if err != nil {
  408. t.Fatal(err)
  409. }
  410. err = sql.Update(sdk.GetInstance(), &sql_tpl.UpdateExecuteParams{
  411. TableName: tableName,
  412. TableRows: sql_tpl.NewTableRows().Add("id", classID).
  413. Add("name", newClassName, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  414. Add("student_num", newStudentNum),
  415. Conditions: sql_tpl.NewConditions().
  416. Equal("id", classID),
  417. })
  418. if err != nil {
  419. t.Fatal(err)
  420. }
  421. err = sql.Delete(sdk.GetInstance(), &sql_tpl.DeleteExecuteParams{
  422. TableName: tableName,
  423. Conditions: sql_tpl.NewConditions().
  424. Equal("id", classID),
  425. })
  426. if err != nil {
  427. t.Fatal(err)
  428. }
  429. _, err = sql.ExecuteRawSql(sdk.GetInstance(), sql_tpl.InsertTpl, insertExecuteParams)
  430. if err != nil {
  431. t.Fatal(err)
  432. }
  433. _, err = sql.ExecuteSql(sdk.GetInstance(), deleteSql, deleteExecuteParams)
  434. if err != nil {
  435. t.Fatal(err)
  436. }
  437. err = sdk.GetInstance().Transaction(func(tx *sdk.Transaction) error {
  438. err = sql.InsertEntity(tx, tableName, class)
  439. if err != nil {
  440. t.Fatal(err)
  441. }
  442. err = sql.UpdateEntity(tx, tableName, newClass)
  443. if err != nil {
  444. t.Fatal(err)
  445. }
  446. err = sql.DeleteEntity(tx, tableName, class)
  447. if err != nil {
  448. t.Fatal(err)
  449. }
  450. err = sql.Insert(tx, &sql_tpl.InsertExecuteParams{
  451. TableName: tableName,
  452. TableRows: sql_tpl.NewTableRows().Add("id", classID).
  453. Add("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  454. Add("student_num", studentNum).
  455. Add("graduated_time", now).
  456. Add("created_time", now).
  457. Add("last_updated_time", now),
  458. })
  459. if err != nil {
  460. t.Fatal(err)
  461. }
  462. err = sql.Update(tx, &sql_tpl.UpdateExecuteParams{
  463. TableName: tableName,
  464. TableRows: sql_tpl.NewTableRows().Add("id", classID).
  465. Add("name", newClassName, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  466. Add("student_num", newStudentNum),
  467. Conditions: sql_tpl.NewConditions().
  468. Equal("id", classID),
  469. })
  470. if err != nil {
  471. t.Fatal(err)
  472. }
  473. err = sql.Delete(tx, &sql_tpl.DeleteExecuteParams{
  474. TableName: tableName,
  475. Conditions: sql_tpl.NewConditions().
  476. Equal("id", classID),
  477. })
  478. if err != nil {
  479. t.Fatal(err)
  480. }
  481. _, err = sql.ExecuteRawSql(tx, sql_tpl.InsertTpl, insertExecuteParams)
  482. if err != nil {
  483. t.Fatal(err)
  484. }
  485. _, err = sql.ExecuteSql(tx, deleteSql, deleteExecuteParams)
  486. if err != nil {
  487. t.Fatal(err)
  488. }
  489. return nil
  490. })
  491. if err != nil {
  492. t.Fatal(err)
  493. }
  494. err = sql.InsertEntity(sdk.GetInstance(), tableName, class)
  495. if err != nil {
  496. t.Fatal(err)
  497. }
  498. tableRows, totalCount, err := sql.Query(sdk.GetInstance(), &sql_tpl.QueryExecuteParams{
  499. TableName: tableName,
  500. SelectColumns: []string{"id", "name"},
  501. Conditions: sql_tpl.NewConditions().
  502. Equal("id", classID).
  503. Equal("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  504. Equal("student_num", studentNum),
  505. PageNo: 0,
  506. PageSize: 0,
  507. })
  508. if err != nil {
  509. t.Fatal(err)
  510. }
  511. if totalCount != 1 || len(tableRows) != int(totalCount) {
  512. t.Fatal("总数不正确")
  513. }
  514. err = sql.ParseSqlTableRow(tableRows, &queryClasses)
  515. if err != nil {
  516. t.Fatal(err)
  517. }
  518. if queryClasses[0].ID != classID ||
  519. queryClasses[0].Name != className ||
  520. queryClasses[0].StudentNum != 0 ||
  521. !queryClasses[0].GraduatedTime.IsZero() ||
  522. (queryClasses[0].CreatedTime != nil && !queryClasses[0].CreatedTime.IsZero()) ||
  523. !queryClasses[0].LastUpdatedTime.IsZero() {
  524. t.Fatal("查询数据不正确")
  525. }
  526. tableRow, err := sql.QueryOne(sdk.GetInstance(), &sql_tpl.QueryOneExecuteParams{
  527. TableName: tableName,
  528. SelectColumns: []string{"id", "name"},
  529. Conditions: sql_tpl.NewConditions().
  530. Equal("id", classID).
  531. Equal("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  532. Equal("student_num", studentNum),
  533. })
  534. if err != nil {
  535. t.Fatal(err)
  536. }
  537. err = sql.ParseSqlTableRow(tableRow, queryClass)
  538. if err != nil {
  539. t.Fatal(err)
  540. }
  541. if queryClass.ID != classID ||
  542. queryClass.Name != className ||
  543. queryClass.StudentNum != 0 ||
  544. !queryClass.GraduatedTime.IsZero() ||
  545. (queryClass.CreatedTime != nil && !queryClass.CreatedTime.IsZero()) ||
  546. !queryClass.LastUpdatedTime.IsZero() {
  547. t.Fatal("查询数据不正确")
  548. }
  549. queryCount, err := sql.Count(sdk.GetInstance(), &sql_tpl.CountExecuteParams{
  550. TableName: tableName,
  551. Conditions: sql_tpl.NewConditions().
  552. Equal("id", classID).
  553. Equal("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  554. Equal("student_num", studentNum),
  555. })
  556. if err != nil {
  557. t.Fatal(err)
  558. }
  559. if queryCount != 1 {
  560. t.Fatal("数量不正确")
  561. }
  562. exist, err := sql.CheckExist(sdk.GetInstance(), &sql_tpl.CheckExistExecuteParams{
  563. TableName: tableName,
  564. Conditions: sql_tpl.NewConditions().
  565. Equal("id", classID).
  566. Equal("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  567. Equal("student_num", studentNum),
  568. })
  569. if err != nil {
  570. t.Fatal(err)
  571. }
  572. if !exist {
  573. t.Fatal("存在状态错误")
  574. }
  575. hasOnlyOne, err := sql.CheckHasOnlyOne(sdk.GetInstance(), &sql_tpl.CheckHasOnlyOneExecuteParams{
  576. TableName: tableName,
  577. Conditions: sql_tpl.NewConditions().
  578. Equal("id", classID).
  579. Equal("name", className, sql_tpl.WithAESKey("@MKU^AHYCN$:j76J<TAHCVD#$XZSWQ@L")).
  580. Equal("student_num", studentNum),
  581. })
  582. if err != nil {
  583. t.Fatal(err)
  584. }
  585. if !hasOnlyOne {
  586. t.Fatal("唯一性错误")
  587. }
  588. err = sql.DeleteEntity(sdk.GetInstance(), tableName, class)
  589. if err != nil {
  590. t.Fatal(err)
  591. }
  592. }