sdk_test.go 17 KB

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