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]) } }