sdk_test.go 20 KB

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