golang高性能嵌入式NoSQL对象数据库插件库objectbox-go的使用

Golang高性能嵌入式NoSQL对象数据库插件库objectbox-go的使用

ObjectBox Go Database

ObjectBox Go数据库通过直观的原生Golang API易于使用,并能超快速且可持续地持久化对象。

高性能Go数据库特性

🏁 高性能 - 在受限设备上表现优异,如IoT网关、微控制器等
💚 资源高效 - 最小化CPU、电源和内存使用
🔗 关系 - 内置对象链接/关系
💻 跨平台 - 支持Linux、Windows、Android、iOS、macOS

🌱 可扩展 - 轻松高效处理数百万对象
💐 查询 - 按需过滤数据,甚至跨关系
🦮 静态类型 - 编译时检查和优化
📃 自动模式迁移 - 无需更新脚本

快速开始

安装ObjectBox

在项目目录中执行以下命令安装ObjectBox:

bash <(curl -s https://raw.githubusercontent.com/objectbox/objectbox-go/main/install.sh)

要安装ObjectBox Sync版本的库,添加--sync参数:

bash <(curl -s https://raw.githubusercontent.com/objectbox/objectbox-go/main/install.sh) --sync

运行测试验证安装:

go test github.com/objectbox/objectbox-go/...

完整示例Demo

1. 定义实体结构

//go:generate go run github.com/objectbox/objectbox-go/cmd/objectbox-gogen

type Task struct {
	Id   uint64
	Text string
}

2. 生成代码

在项目目录中运行:

go generate ./...

这将生成一些文件,记得将它们加入版本控制。

3. 使用ObjectBox

package main

import (
	"fmt"
	"github.com/objectbox/objectbox-go/objectbox"
)

func main() {
	// 创建ObjectBox实例
	obx := objectbox.NewBuilder().Model(ObjectBoxModel()).Build()
	
	// 获取Task对象的Box(由代码生成器生成)
	box := BoxForTask(obx)
	
	// 添加新任务
	id, err := box.Put(&Task{Text: "Buy milk"})
	if err != nil {
		panic(err)
	}
	fmt.Printf("Added task with ID: %d\n", id)
	
	// 查询所有任务
	tasks, err := box.GetAll()
	if err != nil {
		panic(err)
	}
	
	fmt.Println("All tasks:")
	for _, task := range tasks {
		fmt.Printf("- %s (ID: %d)\n", task.Text, task.Id)
	}
	
	// 关闭ObjectBox
	obx.Close()
}

主要特点

ObjectBox通过简单的CRUD API持久化你的原生Go结构体:

id, err := box.Put(&Person{ FirstName: "Joe", LastName: "Green" })

升级到新版本

要更新时,请重新运行整个安装过程以确保所有组件都更新:

bash <(curl -s https://raw.githubusercontent.com/objectbox/objectbox-go/main/install.sh)

然后重新生成代码:

go generate ./...

许可证

Copyright 2018-2024 ObjectBox Ltd. All rights reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

更多关于golang高性能嵌入式NoSQL对象数据库插件库objectbox-go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能嵌入式NoSQL对象数据库插件库objectbox-go的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


objectbox-go: 高性能嵌入式NoSQL对象数据库插件库

objectbox-go 是一个高性能的嵌入式 NoSQL 对象数据库,专为 Go 语言设计。它提供了对象持久化、实时数据同步和高效查询等功能,非常适合嵌入式系统和本地存储场景。

主要特性

  • 高性能:基于 C++ 核心,提供接近原生速度的操作
  • 零配置:开箱即用,无需服务器设置
  • 对象关系映射:自动将 Go 结构体映射到数据库
  • 实时查询:支持数据变化的实时通知
  • 跨平台:支持 Windows、Linux、macOS 等平台

安装

首先安装 objectbox-go 和 objectbox-generator:

go get -u github.com/objectbox/objectbox-go
go get -u github.com/objectbox/objectbox-go/cmd/objectbox-gogen

基本使用示例

1. 定义数据模型

//go:generate go run github.com/objectbox/objectbox-go/cmd/objectbox-gogen

type Task struct {
	Id           uint64
	Text         string
	DateCreated  time.Time
	DateFinished time.Time
}

运行 go generate 生成绑定代码:

go generate ./...

2. 初始化数据库

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/objectbox/objectbox-go/objectbox"
)

func main() {
	// 创建 ObjectBox 实例
	ob, err := objectbox.NewBuilder().Model(ObjectBoxModel()).Build()
	if err != nil {
		log.Fatal(err)
	}
	defer ob.Close()

	// 获取 Task 的 Box (类似于表)
	box := BoxForTask(ob)

	// 创建并保存新任务
	task := &Task{
		Text:        "Learn ObjectBox",
		DateCreated: time.Now(),
	}
	id, err := box.Put(task)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Task saved with ID: %d\n", id)

	// 查询所有任务
	tasks, err := box.GetAll()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("All tasks:")
	for _, t := range tasks {
		fmt.Printf("- %s (ID: %d)\n", t.Text, t.Id)
	}
}

高级功能示例

1. 条件查询

// 查询未完成的任务
query := box.Query(
	Task_.DateFinished.Equals(0),
)
tasks, err := query.Find()
if err != nil {
	log.Fatal(err)
}

2. 实时数据观察

// 创建观察者
subscription := box.Subscribe(func() {
	tasks, _ := box.GetAll()
	fmt.Println("Tasks updated, count:", len(tasks))
})

// 取消订阅(通常在程序退出时)
defer subscription.Close()

3. 事务处理

err := ob.RunInWriteTx(func() error {
	// 在事务中执行多个操作
	_, err1 := box.Put(&Task{Text: "Task 1"})
	_, err2 := box.Put(&Task{Text: "Task 2"})
	
	if err1 != nil || err2 != nil {
		return fmt.Errorf("transaction failed")
	}
	return nil
})

性能优化技巧

  1. 批量操作:使用 PutMany 替代多次 Put

    tasks := []*Task{
        {Text: "Task 1"},
        {Text: "Task 2"},
    }
    _, err := box.PutMany(tasks)
    
  2. 索引优化:为频繁查询的字段添加索引

    // 在模型定义中添加注释
    type Task struct {
        Id   uint64
        Text string `objectbox:"index"`
    }
    
  3. 使用查询构建器:避免每次都重新构建查询

    unfinishedQuery := box.Query(Task_.DateFinished.Equals(0))
    defer unfinishedQuery.Close()
    

与其它数据库比较

  • 相比 SQLite:objectbox-go 提供更自然的对象持久化,无需手动处理 ORM
  • 相比 BoltDB:objectbox-go 有更丰富的查询功能和类型支持
  • 相比 Badger:objectbox-go 提供更高级的对象关系映射

适用场景

  • 需要本地持久化的桌面应用
  • 移动应用的后端数据存储
  • 嵌入式系统和 IoT 设备
  • 需要高性能读写的应用

objectbox-go 是一个强大而轻量级的解决方案,特别适合需要嵌入式数据库但又不想处理复杂 SQL 或低级别键值存储的开发场景。

回到顶部