query_select_test.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package DB
  2. import (
  3. "path/filepath"
  4. "testing"
  5. )
  6. // TestQuerySelectProjection ORM 层 Select 投影: 只解码选中列,
  7. // 未选中字段保持零值; 与 ORDER BY 组合时排序仍正确。
  8. func TestQuerySelectProjection(t *testing.T) {
  9. type Emp struct {
  10. BaseModel
  11. Name string `vrtx:"maxlen:32"`
  12. Age int64 `vrtx:"index"`
  13. Score int64
  14. }
  15. db, err := Open(filepath.Join(t.TempDir(), "test.db"))
  16. if err != nil {
  17. t.Fatalf("open: %v", err)
  18. }
  19. defer db.Close()
  20. tbl, err := UseTable[Emp](db, "emp")
  21. if err != nil {
  22. t.Fatalf("use table: %v", err)
  23. }
  24. for i := 1; i <= 20; i++ {
  25. if err := tbl.Insert(&Emp{Name: "n", Age: int64(i), Score: int64(i * 10)}); err != nil {
  26. t.Fatalf("insert %d: %v", i, err)
  27. }
  28. }
  29. if err := db.Commit(); err != nil {
  30. t.Fatalf("commit: %v", err)
  31. }
  32. // 只选 Age: Name/Score 为零值, Age 正确
  33. rows, err := tbl.Query().Select("Age").Where("Age", ">", int64(17)).OrderBy("Age").Find()
  34. if err != nil {
  35. t.Fatalf("select: %v", err)
  36. }
  37. if len(rows) != 3 {
  38. t.Fatalf("应命中 3 行, 得到 %d", len(rows))
  39. }
  40. for i, r := range rows {
  41. want := int64(18 + i)
  42. if r.Age != want || r.Name != "" || r.Score != 0 {
  43. t.Fatalf("第 %d 行 = %+v, 想要 Age=%d 其余零值", i, r, want)
  44. }
  45. }
  46. // 全列对照: 不限 select 时所有字段都在
  47. full, err := tbl.Query().Where("Age", "=", int64(5)).Find()
  48. if err != nil {
  49. t.Fatalf("full: %v", err)
  50. }
  51. if len(full) != 1 || full[0].Name != "n" || full[0].Score != 50 {
  52. t.Fatalf("全列查询结果 %+v", full[0])
  53. }
  54. }