package DB import ( "path/filepath" "testing" ) // 钉住 ORM Where 的 "in" 操作符行为 (docs/OPERATION_TUTORIAL.md §7.3 的承诺): // - 切片/数组值 → field IN (...) // - 空集合 → 恒假 (0 行), 不能退化成查全表 // - 单值 (非切片) → 容忍为等值 // - 分量按列类型归一 (int 字面量 vs int64 列) func TestWhereIn(t *testing.T) { db, err := Open(filepath.Join(t.TempDir(), "in_test.db")) if err != nil { t.Fatal(err) } defer db.Close() type Emp struct { BaseModel Name string `vrtx:"maxlen:16"` Dept string `vrtx:"maxlen:16"` Age int64 `vrtx:"index:idx_age"` } et, err := UseTable[Emp](db, "in_test") if err != nil { t.Fatal(err) } for i, dept := range []string{"工程部", "技术部", "销售部", "工程部"} { if err := et.Insert(&Emp{Name: "e", Dept: dept, Age: int64(20 + i)}); err != nil { t.Fatal(err) } } if err := db.Commit(); err != nil { t.Fatal(err) } // 基本形态: 字符串集合 rows, err := et.Where("Dept", "in", []string{"工程部", "技术部"}).Find() if err != nil { t.Fatal(err) } if len(rows) != 3 { t.Fatalf("in [工程部,技术部] 期望 3 行, 实际 %d", len(rows)) } // 整数集合: int 分量对 int64 列自动归一 rows, err = et.Where("Age", "in", []int{20, 22}).Find() if err != nil { t.Fatal(err) } if len(rows) != 2 { t.Fatalf("in [20,22] 期望 2 行, 实际 %d", len(rows)) } // 数组载体 rows, err = et.Where("Age", "in", [1]int64{23}).Find() if err != nil { t.Fatal(err) } if len(rows) != 1 { t.Fatalf("in [24] 期望 1 行, 实际 %d", len(rows)) } // 空集合恒假: 0 行, 而不是退化成全表 rows, err = et.Where("Dept", "in", []string{}).Find() if err != nil { t.Fatal(err) } if len(rows) != 0 { t.Fatalf("in 空集期望 0 行, 实际 %d (退化成全表了)", len(rows)) } cnt, err := et.Where("Age", "in", []int64{}).Count() if err != nil { t.Fatal(err) } if cnt != 0 { t.Fatalf("in 空集 Count 期望 0, 实际 %d", cnt) } // 与其它条件 AND 组合 rows, err = et.Where("Dept", "in", []string{"工程部", "技术部"}). Where("Age", ">", int64(21)).Find() if err != nil { t.Fatal(err) } if len(rows) != 1 { t.Fatalf("in + > 组合期望 1 行, 实际 %d", len(rows)) } // 集合外无一行命中 rows, err = et.Where("Dept", "in", []string{"人事部"}).Find() if err != nil { t.Fatal(err) } if len(rows) != 0 { t.Fatalf("in [人事部] 期望 0 行, 实际 %d", len(rows)) } // 单值容忍: ≡ 等值 rows, err = et.Where("Age", "in", int64(20)).Find() if err != nil { t.Fatal(err) } if len(rows) != 1 { t.Fatalf("in 单值期望 1 行, 实际 %d", len(rows)) } }