golang轻量级JSON文本文件数据库管理插件库hare的使用
golang轻量级JSON文本文件数据库管理插件库hare的使用
简介
Hare是一个用Go编写的轻量级数据库管理系统,它将每个表存储为一个行分隔的JSON文本文件。每行JSON代表一条记录。它非常适合需要简单嵌入式DBMS的应用程序。
安装
要开始使用Hare,请先安装Go,然后运行以下命令:
$ go get github.com/jameycribbs/hare
使用示例
1. 设置Hare使用JSON文件
首先需要创建一个数据存储实例。以下示例使用Disk数据存储:
ds, err := disk.New("./data", ".json")
Hare还提供Ram数据存储用于内存数据库。
然后,将数据存储传递给Hare的New函数,它将返回一个Database实例:
db, err := hare.New(ds)
2. 创建记录
使用Insert方法添加记录:
recID, err := db.Insert("contacts", &models.Contact{FirstName: "John", LastName: "Doe", Phone: "888-888-8888", Age: 21})
3. 查找记录
如果知道记录ID,可以使用Find方法:
var c models.Contact
err = db.Find("contacts", 1, &c)
4. 更新记录
使用Update方法更新记录:
c.Age = 22
err = db.Update("contacts", &c)
5. 删除记录
使用Delete方法删除记录:
err = db.Delete("contacts", 3)
6. 查询
可以使用纯Go编写查询表达式,并将其作为闭包传递给模型的QueryContacts函数:
results, err := models.QueryContacts(db, func(c models.Contact) bool {
return c.firstname == "John" && c.lastname == "Doe"
}, 0)
7. 关联
可以创建关联(类似于Rails中的"belongs_to")。例如,可以创建另一个名为"relationships"的表,其中包含"id"和"type"字段(如"Spouse"、“Sister”、"Co-worker"等)。然后,在contacts表中添加一个"relationship_id"字段和一个嵌入的Relationship结构体。最后,在Contact模型的"AfterFind"方法中添加代码来查找关联的关系并填充嵌入的Relationship结构体。
数据库管理
Hare提供了一些内置方法来管理数据库,可以创建新表或删除现有表。当Hare更新现有记录时,如果更改的记录长度小于旧记录长度,Hare将覆盖旧数据并用"X"填充额外的空间。如果更改的记录长度大于旧记录长度,Hare将在文件末尾写入更改的记录,并用"X"覆盖旧记录。
特性
- 每个表的记录存储在新行分隔的JSON文件中
- 使用互斥锁进行表锁定
- 查询使用Go本身完成,无需使用DSL
- 每次读取记录时自动运行AfterFind回调
- 使用Disk数据存储时,数据库不会读入内存
- 提供两种后端数据存储选择:Disk或Ram
完整示例
以下是一个完整的示例demo:
package main
import (
"fmt"
"log"
"github.com/jameycribbs/hare"
"github.com/jameycribbs/hare/datastores/disk"
)
// 定义Contact模型
type Contact struct {
ID int `json:"id"`
FirstName string `json:"firstname"`
LastName string `json:"lastname"`
Phone string `json:"phone"`
Age int `json:"age"`
}
// 实现hare.Record接口所需的方法
func (c *Contact) GetID() int {
return c.ID
}
func (c *Contact) SetID(id int) {
c.ID = id
}
func (c *Contact) AfterFind(db *hare.Database) error {
// 可以在这里实现关联查询等操作
return nil
}
func main() {
// 创建数据存储
ds, err := disk.New("./data", ".json")
if err != nil {
log.Fatal(err)
}
// 创建数据库实例
db, err := hare.New(ds)
if err != nil {
log.Fatal(err)
}
// 创建记录
id, err := db.Insert("contacts", &Contact{
FirstName: "John",
LastName: "Doe",
Phone: "888-888-8888",
Age: 21,
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Created record with ID: %d\n", id)
// 查找记录
var c Contact
err = db.Find("contacts", id, &c)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Found contact: %+v\n", c)
// 更新记录
c.Age = 22
err = db.Update("contacts", &c)
if err != nil {
log.Fatal(err)
}
fmt.Println("Record updated")
// 再次查找验证更新
err = db.Find("contacts", id, &c)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Updated contact: %+v\n", c)
// 删除记录
err = db.Delete("contacts", id)
if err != nil {
log.Fatal(err)
}
fmt.Println("Record deleted")
}
这个示例展示了Hare的基本CRUD操作。在实际应用中,你可能还需要实现查询功能和关联关系处理。
更多关于golang轻量级JSON文本文件数据库管理插件库hare的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang轻量级JSON文本文件数据库管理插件库hare的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用Hare轻量级JSON数据库管理库
Hare是一个轻量级的Go语言JSON文本文件数据库管理库,它提供了简单易用的API来操作基于JSON文件的数据库。下面我将详细介绍Hare的使用方法。
安装Hare
首先使用go get安装Hare:
go get github.com/jameycribbs/hare
基本使用方法
1. 初始化数据库
package main
import (
"fmt"
"log"
"github.com/jameycribbs/hare"
)
type Person struct {
ID int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
// 初始化数据库
db, err := hare.New("data", "people", &Person{})
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 使用数据库...
}
2. 插入数据
// 创建新记录
person := Person{
ID: 1,
Name: "Alice",
Age: 30,
}
// 插入记录
err = db.Insert(person)
if err != nil {
log.Fatal(err)
}
3. 查询数据
// 根据ID查询
var result Person
err = db.Find(1, &result)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Found: %+v\n", result)
// 查询所有记录
ids, err := db.IDs()
if err != nil {
log.Fatal(err)
}
for _, id := range ids {
var p Person
err = db.Find(id, &p)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Person %d: %+v\n", id, p)
}
4. 更新数据
// 更新记录
updatedPerson := Person{
ID: 1,
Name: "Alice Smith",
Age: 31,
}
err = db.Update(updatedPerson)
if err != nil {
log.Fatal(err)
}
5. 删除数据
// 删除记录
err = db.Delete(1)
if err != nil {
log.Fatal(err)
}
高级功能
1. 查询所有记录
// 获取所有记录
var allPeople []Person
err = db.FindAll(&allPeople)
if err != nil {
log.Fatal(err)
}
for _, p := range allPeople {
fmt.Printf("Person: %+v\n", p)
}
2. 条件查询
Hare本身不提供复杂的查询功能,但可以结合Go代码实现:
// 自定义查询函数
func findAdults(db *hare.Database) ([]Person, error) {
var all []Person
var adults []Person
err := db.FindAll(&all)
if err != nil {
return nil, err
}
for _, p := range all {
if p.Age >= 18 {
adults = append(adults, p)
}
}
return adults, nil
}
// 使用自定义查询
adults, err := findAdults(db)
if err != nil {
log.Fatal(err)
}
for _, a := range adults {
fmt.Printf("Adult: %+v\n", a)
}
3. 事务处理
// 开始事务
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
// 在事务中操作
err = tx.Insert(Person{ID: 2, Name: "Bob", Age: 25})
if err != nil {
tx.Rollback()
log.Fatal(err)
}
// 提交事务
err = tx.Commit()
if err != nil {
log.Fatal(err)
}
注意事项
- Hare是一个简单的JSON文件数据库,不适合高并发场景
- 每个表对应一个JSON文件,存储在指定的目录中
- 所有操作都是同步的,没有内置的缓存机制
- 对于大型数据集,性能可能不如专业数据库
完整示例
package main
import (
"fmt"
"log"
"github.com/jameycribbs/hare"
)
type Book struct {
ID int `json:"id"`
Title string `json:"title"`
Author string `json:"author"`
Year int `json:"year"`
}
func main() {
// 初始化数据库
db, err := hare.New("library", "books", &Book{})
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 插入几本书
books := []Book{
{ID: 1, Title: "The Go Programming Language", Author: "Alan A. A. Donovan", Year: 2015},
{ID: 2, Title: "Clean Code", Author: "Robert C. Martin", Year: 2008},
{ID: 3, Title: "Design Patterns", Author: "Erich Gamma", Year: 1994},
}
for _, book := range books {
err = db.Insert(book)
if err != nil {
log.Fatal(err)
}
}
// 查询所有书籍
var allBooks []Book
err = db.FindAll(&allBooks)
if err != nil {
log.Fatal(err)
}
fmt.Println("All Books:")
for _, b := range allBooks {
fmt.Printf("- %s by %s (%d)\n", b.Title, b.Author, b.Year)
}
// 更新一本书
updatedBook := Book{
ID: 1,
Title: "The Go Programming Language (2nd Edition)",
Author: "Alan A. A. Donovan and Brian W. Kernighan",
Year: 2021,
}
err = db.Update(updatedBook)
if err != nil {
log.Fatal(err)
}
// 删除一本书
err = db.Delete(3)
if err != nil {
log.Fatal(err)
}
// 再次查询所有书籍
err = db.FindAll(&allBooks)
if err != nil {
log.Fatal(err)
}
fmt.Println("\nUpdated Book List:")
for _, b := range allBooks {
fmt.Printf("- %s by %s (%d)\n", b.Title, b.Author, b.Year)
}
}
Hare是一个非常适合小型项目、配置存储或原型开发的轻量级解决方案。对于需要更复杂功能或更高性能的场景,建议考虑SQLite或其他专业数据库。