3.7 KiB
3.7 KiB
StructToFields 示例
这个示例展示如何使用 StructToFields 方法从 Go 结构体自动生成 Schema。
功能特性
- ✅ 从结构体自动生成 Field 列表
- ✅ 支持 struct tags 定义字段属性
- ✅ 支持索引标记
- ✅ 支持字段注释
- ✅ 自动类型映射
- ✅ 支持忽略字段
Struct Tag 格式
srdb tag
所有配置都在 srdb tag 中,使用分号 ; 分隔:
type User struct {
// 基本用法:指定字段名
Name string `srdb:"name"`
// 标记为索引字段
Email string `srdb:"email;indexed"`
// 完整格式:字段名;索引;注释
Age int64 `srdb:"age;comment:年龄"`
// 带索引和注释
Phone string `srdb:"phone;indexed;comment:手机号"`
// 忽略该字段
Internal string `srdb:"-"`
// 不使用 tag,默认使用 snake_case 转换
Score float64 // 字段名: score
UserID string // 字段名: user_id
}
Tag 格式说明
格式:srdb:"字段名;选项1;选项2;..."
- 字段名(第一部分):指定数据库中的字段名,省略则自动将结构体字段名转为 snake_case
- indexed:标记该字段需要建立索引
- comment:注释内容:字段注释说明
默认字段名转换(snake_case)
如果不指定字段名,会自动将驼峰命名转换为 snake_case:
UserName→user_nameEmailAddress→email_addressIsActive→is_activeHTTPServer→http_serverID→id
类型映射
| Go 类型 | FieldType |
|---|---|
| int, int64, int32, int16, int8 | FieldTypeInt64 |
| uint, uint64, uint32, uint16, uint8 | FieldTypeInt64 |
| string | FieldTypeString |
| float64, float32 | FieldTypeFloat |
| bool | FieldTypeBool |
完整示例
package main
import (
"log"
"code.tczkiot.com/wlw/srdb"
)
// 定义结构体
type User struct {
Name string `srdb:"name;indexed;comment:用户名"`
Age int64 `srdb:"age;comment:年龄"`
Email string `srdb:"email;indexed;comment:邮箱"`
Score float64 `srdb:"score;comment:分数"`
IsActive bool `srdb:"is_active;comment:是否激活"`
}
func main() {
// 1. 从结构体生成 Field 列表
fields, err := srdb.StructToFields(User{})
if err != nil {
log.Fatal(err)
}
// 2. 创建 Schema
schema := srdb.NewSchema("users", fields)
// 3. 创建表
table, err := srdb.OpenTable(&srdb.TableOptions{
Dir: "./data/users",
Name: schema.Name,
Fields: schema.Fields,
})
if err != nil {
log.Fatal(err)
}
defer table.Close()
// 4. 插入数据
err = table.Insert(map[string]any{
"name": "张三",
"age": int64(25),
"email": "zhangsan@example.com",
"score": 95.5,
"is_active": true,
})
// 5. 查询数据(自动使用索引)
rows, _ := table.Query().Eq("email", "zhangsan@example.com").Rows()
defer rows.Close()
for rows.Next() {
data := rows.Row().Data()
// 处理数据...
}
}
运行示例
cd examples/struct_schema
go run main.go
优势
- 类型安全: 使用结构体定义,编译时检查类型
- 简洁: 不需要手动创建 Field 列表
- 可维护: 结构体和 Schema 在一起,便于维护
- 灵活: 支持 tag 自定义字段属性
- 自动索引: 通过
indexedtag 自动创建索引
注意事项
- 只有导出的字段(首字母大写)会被包含
- 使用
srdb:"-"可以忽略字段 - 如果不指定字段名,默认使用小写的字段名
- 不支持嵌套结构体(需要手动展开)
- 不支持切片、map 等复杂类型