sdk_test.go 20 KB

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