| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- package DB
- import (
- "path/filepath"
- "testing"
- )
- // TestQuerySelectProjection ORM 层 Select 投影: 只解码选中列,
- // 未选中字段保持零值; 与 ORDER BY 组合时排序仍正确。
- func TestQuerySelectProjection(t *testing.T) {
- type Emp struct {
- BaseModel
- Name string `vrtx:"maxlen:32"`
- Age int64 `vrtx:"index"`
- Score int64
- }
- db, err := Open(filepath.Join(t.TempDir(), "test.db"))
- if err != nil {
- t.Fatalf("open: %v", err)
- }
- defer db.Close()
- tbl, err := UseTable[Emp](db, "emp")
- if err != nil {
- t.Fatalf("use table: %v", err)
- }
- for i := 1; i <= 20; i++ {
- if err := tbl.Insert(&Emp{Name: "n", Age: int64(i), Score: int64(i * 10)}); err != nil {
- t.Fatalf("insert %d: %v", i, err)
- }
- }
- if err := db.Commit(); err != nil {
- t.Fatalf("commit: %v", err)
- }
- // 只选 Age: Name/Score 为零值, Age 正确
- rows, err := tbl.Query().Select("Age").Where("Age", ">", int64(17)).OrderBy("Age").Find()
- if err != nil {
- t.Fatalf("select: %v", err)
- }
- if len(rows) != 3 {
- t.Fatalf("应命中 3 行, 得到 %d", len(rows))
- }
- for i, r := range rows {
- want := int64(18 + i)
- if r.Age != want || r.Name != "" || r.Score != 0 {
- t.Fatalf("第 %d 行 = %+v, 想要 Age=%d 其余零值", i, r, want)
- }
- }
- // 全列对照: 不限 select 时所有字段都在
- full, err := tbl.Query().Where("Age", "=", int64(5)).Find()
- if err != nil {
- t.Fatalf("full: %v", err)
- }
- if len(full) != 1 || full[0].Name != "n" || full[0].Score != 50 {
- t.Fatalf("全列查询结果 %+v", full[0])
- }
- }
|