03-第3章-基础CRUD操作

第 3 章:基础 CRUD 操作


3.1 完整的可运行示例

让我们通过一个完整的示例来演示 sfsDb 的基础 CRUD 操作:

go 复制代码
package main

import (
	"fmt"
	"os"

	"github.com/liaoran123/sfsDb/engine"
	"github.com/liaoran123/sfsDb/storage"
)

func main() {
	fmt.Println("=== sfsDb 数据库实战 - 第 3 章:基础 CRUD 操作示例 ===")
	fmt.Println()

	dbPath := "./bible_examples_chapter03_db"
	cleanup(dbPath)

	fmt.Println("1. 初始化数据库")
	_, err := storage.GetDBManager().OpenDB(dbPath)
	if err != nil {
		fmt.Printf("数据库打开失败: %v\n", err)
		return
	}
	defer storage.GetDBManager().CloseDB()
	fmt.Println("   ✓ 数据库打开成功")
	fmt.Println()

	fmt.Println("2. 创建表并设置字段")
	table, err := engine.NewTable("employees")
	if err != nil {
		fmt.Printf("创建表失败: %v\n", err)
		return
	}

	fields := map[string]any{
		"id":     0,
		"name":   "",
		"age":    0,
		"department": "",
		"salary": 0,
	}
	err = table.SetFields(fields)
	if err != nil {
		fmt.Printf("设置字段失败: %v\n", err)
		return
	}

	primaryKey, err := engine.NewDefaultPrimaryKey("pk_id")
	primaryKey.AddFields("id")
	table.CreateIndex(primaryKey)
	fmt.Println("   ✓ 表创建成功")
	fmt.Println()

	fmt.Println("3. 插入数据 (Create)")
	employees := []map[string]any{
		{"id": 1, "name": "张三", "age": 28, "department": "技术部", "salary": 15000},
		{"id": 2, "name": "李四", "age": 32, "department": "市场部", "salary": 12000},
		{"id": 3, "name": "王五", "age": 25, "department": "技术部", "salary": 13000},
	}

	for _, emp := range employees {
		_, err = table.Insert(&emp)
		if err != nil {
			fmt.Printf("插入数据失败: %v\n", err)
			return
		}
	}
	fmt.Println("   ✓ 成功插入", len(employees), "条员工数据")
	fmt.Println()

	fmt.Println("4. 查询数据 (Read)")
	searchAll := map[string]any{"id": nil}
	dataIter, _ := table.Search(&searchAll)
	defer dataIter.Release()
	
	records := dataIter.GetRecords(true)
	defer records.Release()
	
	fmt.Println("   所有员工列表:")
	for _, emp := range records {
		fmt.Printf("   - ID: %v, 姓名: %v, 年龄: %v, 部门: %v, 薪资: %v\n",
			emp["id"], emp["name"], emp["age"], emp["department"], emp["salary"])
	}
	fmt.Println()

	fmt.Println("5. 更新数据 (Update)")
	updateEmp := map[string]any{
		"id":     1,
		"salary": 18000,
	}
	err = table.Update(&updateEmp)
	if err != nil {
		fmt.Printf("更新数据失败: %v\n", err)
		return
	}
	fmt.Println("   ✓ 成功更新员工 ID=1 的薪资")
	
	searchEmp := map[string]any{"id": 1}
	dataIter2, _ := table.Search(&searchEmp)
	defer dataIter2.Release()
	updatedRecord := dataIter2.GetRecords(true)
	defer updatedRecord.Release()
	fmt.Printf("   更新后的数据: %+v\n", updatedRecord[0])
	fmt.Println()

	fmt.Println("6. 删除数据 (Delete)")
	deleteEmp := map[string]any{"id": 3}
	err = table.Delete(&deleteEmp)
	if err != nil {
		fmt.Printf("删除数据失败: %v\n", err)
		return
	}
	fmt.Println("   ✓ 成功删除员工 ID=3")
	
	dataIter3, _ := table.Search(&searchAll)
	defer dataIter3.Release()
	finalRecords := dataIter3.GetRecords(true)
	defer finalRecords.Release()
	fmt.Println("   删除后的员工列表:")
	for _, emp := range finalRecords {
		fmt.Printf("   - ID: %v, 姓名: %v\n", emp["id"], emp["name"])
	}
	fmt.Println()

	fmt.Println("=== CRUD 操作演示完成!===")
}

func cleanup(path string) {
	os.RemoveAll(path)
}

这段代码展示了 sfsDb 的完整 CRUD 操作流程:

  1. 初始化数据库 :通过 storage.GetDBManager().OpenDB() 打开数据库
  2. 创建表 :使用 engine.NewTable() 创建表
  3. 设置字段 :通过 SetFields() 定义表结构
  4. 创建索引 :使用 CreateIndex() 创建主键索引
  5. 插入数据 :使用 Insert() 插入多条员工数据
  6. 查询数据 :使用 Search() 查询所有记录
  7. 更新数据 :使用 Update() 更新指定记录
  8. 删除数据 :使用 Delete() 删除指定记录

3.2 小结

本章我们通过项目的实际代码学习了 sfsDb 的基础 CRUD 操作:

  • 创建表 :使用 NewTable()SetFields()
  • 插入数据 :使用 Insert(),支持自动递增 ID
  • 查询数据 :使用 Search()ForData()
  • 更新数据 :使用 Update(),通过主键定位
  • 删除数据 :使用 Delete(),通过主键删除
  • 资源管理:及时释放迭代器和记录

在下一章中,我们将深入学习索引与查询优化。


本书版本 :1.0.0
最后更新 :2026-03-11
sfsDb - 以工业物联网边缘计算为核心场景的高性能嵌入式数据库!🚀
技术栈 - Go、leveldb。纯golang实现。
项目地址GitHub
GitCode 镜像GitCode

相关推荐
吉甫作诵8 分钟前
Redis 常用命令大全:11 大类命令速查手册
运维·数据库·redis·缓存·nosql
2501_9336707913 分钟前
库存管理分析岗校招能力模型:SQL、库存周转、补货预测怎么准备
数据库
星野云联AIoT技术洞察32 分钟前
RK3588 边缘 AI 盒子适合什么工业视觉场景
计算机视觉·边缘计算·rk3588·语音识别·图像识别·边缘网关·边缘计算盒子
xhload3d37 分钟前
图扑智慧工厂 | 继电器产线仿真态势管控平台
物联网·低代码·webgl·数字孪生·可视化·智慧工厂·工业互联网·hightopo
属于自己的天空1 小时前
不用再手动查表结构了:配好 MCP,Claude Code 自己读数据库生成代码
数据库·后端
Y3815326621 小时前
SERP 数据清洗实战:字段标准化、日期解析与去重键
开发语言·数据库·python·python数据库
Databend1 小时前
Databend 原生数据血缘:追溯指标来源,检查变更影响
大数据·数据库·sql
镜舟科技1 小时前
Semantic View 技术解析(二):业务口径如何进入数据库执行路径
数据库·sql·agent
TechWJ2 小时前
没有公网 IP 也想远程连 PostgreSQL?从本地数据库到固定 TCP 地址完整配置
大数据·数据库·网络安全·postgresql·内网穿透
得物技术3 小时前
指标平台:从语义底座到智能消费的实践路径|得物技术
数据库·人工智能·ai编程