sdk_test.go 22 KB

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