golang嵌入式数据库boltdb工具之storm的使用
初始化#
1 2 | db, err := storm.Open( "my.db" ) defer db.Close() |
对象模型#
1 2 3 4 5 6 7 | type User struct { ID int // primary key Group string `storm: "index" ` // this field will be indexed Email string `storm: "unique" ` // this field will be indexed with a unique constraint Name string // this field will not be indexed Age int `storm: "index" ` } |
对象模型storm tag整理#
可以符合使用, 各个值用 , (逗号) 分割
- storm:"index" 添加索引
- storm:"id" 主键标识
- storm:"increment" 自增字段
- storm:"increment=20" 自增字段, 从20开始自增
- storm:"unique" 不能重复
- storm:"inline" 内联标记嵌套
- storm:"__storm_index_" ???
保存数据#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | user := User{ ID: 10, Group: "staff" , Email: "john@provider.com" , Name: "John" , Age: 21, CreatedAt: time.Now(), } err := db.Save(&user) // err == nil user.ID++ err = db.Save(&user) // err == storm.ErrAlreadyExists |
修改#
1 2 3 4 5 | // Update multiple fields err := db.Update(&User{ID: 10, Name: "Jack" , Age: 45}) // Update a single field err := db.UpdateField(&User{ID: 10}, "Age" , 0) |
删除数据#
1 | err := db.DeleteStruct(&user) |
表管理操作#
- 初始化索引
err := db.Init(&User{})
- 重建索引:
err := db.ReIndex(&User{})
- 删表:
err := db.Drop(&User)
或err := db.Drop("User")
简单查询#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | var user User err := db.One( "Email" , "john@provider.com" , &user) // err == nil err = db.One( "Name" , "John" , &user) // err == nil err = db.One( "Name" , "Jack" , &user) // err == storm.ErrNotFound // Fetch multiple objects var users []User err := db.Find( "Group" , "staff" , &users) // Fetch all objects var users []User err := db.All(&users) // Fetch all objects sorted by index var users []User err := db.AllByIndex( "CreatedAt" , &users) // Fetch a range of objects var users []User err := db.Range( "Age" , 10, 21, &users) // Fetch objects by prefix var users []User err := db.Prefix( "Name" , "Jo" , &users) // Skip, Limit and Reverse var users []User err := db.Find( "Group" , "staff" , &users, storm.Skip(10)) err = db.Find( "Group" , "staff" , &users, storm.Limit(10)) err = db.Find( "Group" , "staff" , &users, storm.Reverse()) err = db.Find( "Group" , "staff" , &users, storm.Limit(10), storm.Skip(10), storm.Reverse()) err = db.All(&users, storm.Limit(10), storm.Skip(10), storm.Reverse()) err = db.AllByIndex( "CreatedAt" , &users, storm.Limit(10), storm.Skip(10), storm.Reverse()) err = db.Range( "Age" , 10, 21, &users, storm.Limit(10), storm.Skip(10), storm.Reverse()) |
高级查询#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | import ( "github.com/asdine/storm/q" <br>)...<br><br> // Equality q.Eq( "Name" , John) // Strictly greater than q.Gt( "Age" , 7) // Lesser than or equal to q.Lte( "Age" , 77) // Regex with name that starts with the letter D q.Re( "Name" , "^D" ) // In the given slice of values q.In( "Group" , []string{ "Staff" , "Admin" }) // Comparing fields q.EqF( "FieldName" , "SecondFieldName" ) q.LtF( "FieldName" , "SecondFieldName" ) q.GtF( "FieldName" , "SecondFieldName" ) q.LteF( "FieldName" , "SecondFieldName" ) q.GteF( "FieldName" , "SecondFieldName" ) // Match if all match q.And( q.Gt( "Age" , 7), q.Re( "Name" , "^D" ) ) // Matchers can also be combined with And, Or and Not: // Match if one matches q.Or( q.Re( "Name" , "^A" ), q.Not( q.Re( "Name" , "^B" ) ), q.Re( "Name" , "^C" ), q.In( "Group" , []string{ "Staff" , "Admin" }), q.And( q.StrictEq( "Password" , []byte(password)), q.Eq( "Registered" , true) ) ) query := db.Select(q.Gte( "Age" , 7), q.Lte( "Age" , 77)) // Calls can also be chained query = query.Limit(10).Skip(20).OrderBy( "Age" ).Reverse() // But also to specify how to fetch them. var users []User err = query.Find(&users) var user User err = query.First(&user) // demo // Examples with Select: / Find all users with an ID between 10 and 100 err = db.Select(q.Gte( "ID" , 10), q.Lte( "ID" , 100)).Find(&users) // Nested matchers err = db.Select(q.Or( q.Gt( "ID" , 50), q.Lt( "Age" , 21), q.And( q.Eq( "Group" , "admin" ), q.Gte( "Age" , 21), ), )).Find(&users) query := db.Select(q.Gte( "ID" , 10), q.Lte( "ID" , 100)).Limit(10).Skip(5).Reverse().OrderBy( "Age" , "Name" ) // Find multiple records err = query.Find(&users) // or err = db.Select(q.Gte( "ID" , 10), q.Lte( "ID" , 100)).Limit(10).Skip(5).Reverse().OrderBy( "Age" , "Name" ).Find(&users) // Find first record err = query.First(&user) // or err = db.Select(q.Gte( "ID" , 10), q.Lte( "ID" , 100)).Limit(10).Skip(5).Reverse().OrderBy( "Age" , "Name" ).First(&user) // Delete all matching records err = query.Delete(new(User)) // Fetching records one by one (useful when the bucket contains a lot of records) query = db.Select(q.Gte( "ID" , 10),q.Lte( "ID" , 100)).OrderBy( "Age" , "Name" ) err = query.Each(new(User), func (record interface {}) error) { u := record.(*User) ... return nil } |
事务#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | tx, err := db.Begin(true) if err != nil { return err } defer tx.Rollback() accountA.Amount -= 100 accountB.Amount += 100 err = tx.Save(accountA) if err != nil { return err } err = tx.Save(accountB) if err != nil { return err } return tx.Commit() |
不同的数据编码方式#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import ( "github.com/asdine/storm/v3" "github.com/asdine/storm/v3/codec/gob" "github.com/asdine/storm/v3/codec/json" "github.com/asdine/storm/v3/codec/sereal" "github.com/asdine/storm/v3/codec/protobuf" "github.com/asdine/storm/v3/codec/msgpack" ) var gobDb, _ = storm.Open( "gob.db" , storm.Codec(gob.Codec)) var jsonDb, _ = storm.Open( "json.db" , storm.Codec(json.Codec)) var serealDb, _ = storm.Open( "sereal.db" , storm.Codec(sereal.Codec)) var protobufDb, _ = storm.Open( "protobuf.db" , storm.Codec(protobuf.Codec)) var msgpackDb, _ = storm.Open( "msgpack.db" , storm.Codec(msgpack.Codec)) |
作者:水车
出处:https://www.cnblogs.com/shuiche/p/12571149.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
推荐一个激活软件下载站:mac.shuiche.cc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2016-03-25 min-height在安卓下不起作用