重构:清理项目结构和完善文档
- 添加完整的 DOCS.md 文档(1376 行) - 更新 README.md,增强项目说明 - 清理临时示例和测试数据 - 删除诊断工具(已完成测试) - 为 webui 示例准备测试数据 - 优化 .gitignore 配置 - 增强 Query 和 Schema 功能 - 改进 SSTable 编码处理
This commit is contained in:
40
query.go
40
query.go
@@ -4,6 +4,7 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"maps"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -658,7 +659,8 @@ func (r *Row) Scan(value any) error {
|
||||
return fmt.Errorf("row is nil")
|
||||
}
|
||||
|
||||
data, err := json.Marshal(r.inner.Data)
|
||||
// 使用 r.Data() 而不是 r.inner.Data,这样会应用字段过滤
|
||||
data, err := json.Marshal(r.Data())
|
||||
if err != nil {
|
||||
return fmt.Errorf("marshal row data: %w", err)
|
||||
}
|
||||
@@ -920,18 +922,40 @@ func (r *Rows) Data() []map[string]any {
|
||||
}
|
||||
|
||||
// Scan 扫描所有行数据到指定的变量
|
||||
// 智能判断目标类型:
|
||||
// - 如果目标是切片:扫描所有行
|
||||
// - 如果目标是结构体/指针:只扫描第一行
|
||||
func (r *Rows) Scan(value any) error {
|
||||
data, err := json.Marshal(r.Collect())
|
||||
if err != nil {
|
||||
return fmt.Errorf("marshal rows data: %w", err)
|
||||
rv := reflect.ValueOf(value)
|
||||
if rv.Kind() != reflect.Ptr {
|
||||
return fmt.Errorf("scan target must be a pointer")
|
||||
}
|
||||
|
||||
err = json.Unmarshal(data, value)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unmarshal to target: %w", err)
|
||||
elem := rv.Elem()
|
||||
kind := elem.Kind()
|
||||
|
||||
// 如果目标是切片,扫描所有行
|
||||
if kind == reflect.Slice {
|
||||
data, err := json.Marshal(r.Collect())
|
||||
if err != nil {
|
||||
return fmt.Errorf("marshal rows data: %w", err)
|
||||
}
|
||||
|
||||
err = json.Unmarshal(data, value)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unmarshal to target: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
return nil
|
||||
// 否则,只扫描第一行
|
||||
row, err := r.First()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return row.Scan(value)
|
||||
}
|
||||
|
||||
// First 获取第一行
|
||||
|
||||
Reference in New Issue
Block a user