golang轻量级JSON文本文件数据库管理插件库hare的使用

golang轻量级JSON文本文件数据库管理插件库hare的使用

Hare Logo

简介

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

1 回复

更多关于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)
}

注意事项

  1. Hare是一个简单的JSON文件数据库,不适合高并发场景
  2. 每个表对应一个JSON文件,存储在指定的目录中
  3. 所有操作都是同步的,没有内置的缓存机制
  4. 对于大型数据集,性能可能不如专业数据库

完整示例

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或其他专业数据库。

回到顶部