golang SurrealDB数据库驱动插件库surrealdb.go的使用

Golang SurrealDB数据库驱动插件库surrealdb.go的使用

官方Golang SurrealDB SDK

surrealdb.go是SurrealDB官方提供的Golang SDK,用于连接和操作SurrealDB数据库。

安装

go get github.com/surrealdb/surrealdb.go

快速开始示例

以下是一个完整的示例,展示如何连接SurrealDB、进行认证、创建数据、查询数据和删除数据:

package main

import (
	"fmt"
	surrealdb "github.com/surrealdb/surrealdb.go"
	"github.com/surrealdb/surrealdb.go/pkg/models"
)

type Person struct {
	ID      	*models.RecordID `json:"id,omitempty"`
	Name    	string `json:"name"`
	Surname 	string `json:"surname"`
	Location 	models.GeometryPoint `json:"location"`
}

func main() {
	// 连接到SurrealDB
	db, err := surrealdb.New("ws://localhost:8000")
	if err != nil {
		panic(err)
	}

	// 设置命名空间和数据库
	if err = db.Use("testNS", "testDB"); err != nil {
		panic(err)
	}

	// 登录认证
	authData := &surrealdb.Auth{
		Username: "root", // 使用你的用户名
		Password: "root", // 使用你的密码
	}
	token, err := db.SignIn(authData)
	if err != nil {
		panic(err)
	}

	// 检查token有效性
	if err := db.Authenticate(token); err != nil {
		panic(err)
	}

	// 稍后可以注销token
	defer func(token string) {
		if err := db.Invalidate(); err != nil {
			panic(err)
		}
	}(token)

	// 创建条目
	person1, err := surrealdb.Create[Person](db, models.Table("persons"), map[interface{}]interface{}{
		"Name":     "John",
		"Surname":  "Doe",
		"Location": models.NewGeometryPoint(-0.11, 22.00),
	})
	if err != nil {
		panic(err)
	}
	fmt.Printf("使用map创建的人员: %+v\n", person1)

	// 或者使用结构体
	person2, err := surrealdb.Create[Person](db, models.Table("persons"), Person{
		Name:     "John",
		Surname:  "Doe",
		Location: models.NewGeometryPoint(-0.11, 22.00),
	})
	if err != nil {
		panic(err)
	}
	fmt.Printf("使用结构体创建的人员: %+v\n", person2)

	// 通过Record ID获取条目
	person, err := surrealdb.Select[Person, models.RecordID](db, *person1.ID)
	if err != nil {
		panic(err)
	}
	fmt.Printf("通过record id查询的人员: %+v\n", person)

	// 或者获取整个表
	persons, err := surrealdb.Select[[]Person, models.Table](db, models.Table("persons"))
	if err != nil {
		panic(err)
	}
	fmt.Printf("persons表中的所有数据: %+v\n", persons)

	// 通过ID删除条目
	if err = surrealdb.Delete[models.RecordID](db, *person2.ID); err != nil {
		panic(err)
	}

	// 删除所有条目
	if err = surrealdb.Delete[models.Table](db, models.Table("persons")); err != nil {
		panic(err)
	}

	// 确认空表
	persons, err = surrealdb.Select[[]Person](db, models.Table("persons"))
	if err != nil {
		panic(err)
	}
	fmt.Printf("没有查询到人员: %+v\n", persons)
}

运行示例的说明

  1. 在新文件夹中创建名为main.go的文件并粘贴上面的代码
  2. 运行go mod init github.com/<github-username>/<project-name>初始化go.mod文件
  3. 运行go mod tidy下载surrealdb.go依赖
  4. 运行go run main.go运行示例

连接引擎

有两种不同的连接引擎可用于连接到SurrealDB后端:Websocket或HTTP连接。

通过Websocket连接

db, err := surrealdb.New("ws://localhost:8000")

或安全连接:

db, err := surrealdb.New("wss://localhost:8000")

通过HTTP连接

db, err := surrealdb.New("http://localhost:8000")

或安全连接:

db, err := surrealdb.New("https://localhost:8000")

数据模型

这个包使用简洁二进制对象表示(CBOR)格式促进客户端和后端服务之间的通信。它简化了数据序列化和反序列化,同时确保高效和轻量级的通信。

CBOR类型 Go表示 示例
Null nil var x interface{} = nil
Boolean bool true, false
Array []interface{} []MyStruct{item1, item2}
Date/Time time.Time time.Now()
UUID surrealdb.UUID(string) surrealdb.UUID("123e4567-e89b-12d3-a456-426614174000")
Integer int, int64 42, int64(-100000)
Floating Point float32, float64 3.14, float64(2.71828)
Text String string "Hello, World!"
Map map[interface{}]interface{} map[string]float64{"one": 1.0}
Table name surrealdb.Table(name) surrealdb.Table("users")
Record ID surrealdb.RecordID{Table: string, ID: interface{}} surrealdb.NewRecordID("customers", 1)

辅助类型

surrealdb.O

对于像create、insert、update这样的方法,可以传递map而不是结构体值。例如:

person, err := surrealdb.Create[Person](db, models.Table("persons"), surrealdb.O{
	"Name":     "John",
	"Surname":  "Doe",
	"Location": models.NewGeometryPoint(-0.11, 22.00),
})

surrealdb.Result[T]

这对于Send函数很有用,其中T是请求的预期响应类型。例如:

var res surrealdb.Result[[]Users]
err := db.Send(&res, "select", model.Table("users"))
if err != nil {
	panic(err)
}
fmt.Printf("users: %+v\n", users.R)

贡献

你可以运行Makefile命令来运行和构建项目:

make build
make test
make lint

更多关于golang SurrealDB数据库驱动插件库surrealdb.go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang SurrealDB数据库驱动插件库surrealdb.go的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


SurrealDB Go 驱动使用指南

SurrealDB 是一个新兴的分布式图数据库,而 surrealdb.go 是它的 Go 语言驱动程序。下面我将详细介绍如何使用这个驱动连接和操作 SurrealDB 数据库。

安装驱动

首先安装 surrealdb.go 驱动:

go get github.com/surrealdb/surrealdb.go

基本使用

1. 连接数据库

package main

import (
	"fmt"
	"log"

	"github.com/surrealdb/surrealdb.go"
)

func main() {
	// 创建数据库连接
	db, err := surrealdb.New("ws://localhost:8000/rpc")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 登录(认证)
	if _, err = db.Signin(map[string]interface{}{
		"user": "root",
		"pass": "root",
	}); err != nil {
		log.Fatal(err)
	}

	// 选择命名空间和数据库
	if _, err = db.Use("test", "test"); err != nil {
		log.Fatal(err)
	}

	fmt.Println("成功连接到SurrealDB!")
}

2. 创建记录

// 创建单个记录
user := map[string]interface{}{
	"username": "john",
	"password": "123456",
	"age":      25,
}

created, err := db.Create("user", user)
if err != nil {
	log.Fatal(err)
}
fmt.Printf("创建的用户: %+v\n", created)

// 批量创建
users := []map[string]interface{}{
	{
		"username": "alice",
		"password": "654321",
		"age":      30,
	},
	{
		"username": "bob",
		"password": "abcdef",
		"age":      28,
	},
}

createdMany, err := db.Create("user", users)
if err != nil {
	log.Fatal(err)
}
fmt.Printf("批量创建的用户: %+v\n", createdMany)

3. 查询数据

// 查询单个记录
selected, err := db.Select("user:john")
if err != nil {
	log.Fatal(err)
}
fmt.Printf("查询结果: %+v\n", selected)

// 执行SQL查询
query := "SELECT * FROM user WHERE age > $age"
bindings := map[string]interface{}{"age": 26}

results, err := db.Query(query, bindings)
if err != nil {
	log.Fatal(err)
}
fmt.Printf("SQL查询结果: %+v\n", results)

4. 更新数据

// 更新记录
changes := map[string]interface{}{
	"age": 26,
}

updated, err := db.Update("user:john", changes)
if err != nil {
	log.Fatal(err)
}
fmt.Printf("更新后的用户: %+v\n", updated)

// 替换整个记录
newUser := map[string]interface{}{
	"username": "john_doe",
	"password": "newpass",
	"age":      27,
}

replaced, err := db.Change("user:john", newUser)
if err != nil {
	log.Fatal(err)
}
fmt.Printf("替换后的用户: %+v\n", replaced)

5. 删除数据

// 删除单个记录
deleted, err := db.Delete("user:john")
if err != nil {
	log.Fatal(err)
}
fmt.Printf("删除的用户: %+v\n", deleted)

// 删除所有用户记录
_, err = db.Delete("user")
if err != nil {
	log.Fatal(err)
}

高级功能

1. 使用结构体

type User struct {
	Username string `json:"username"`
	Password string `json:"password"`
	Age      int    `json:"age"`
}

// 创建结构体记录
newUser := User{
	Username: "emma",
	Password: "emma123",
	Age:      22,
}

createdUser, err := db.Create("user", newUser)
if err != nil {
	log.Fatal(err)
}

// 查询到结构体
var user User
if err = db.Unmarshal(createdUser, &user); err != nil {
	log.Fatal(err)
}
fmt.Printf("结构体用户: %+v\n", user)

2. 事务处理

// 开始事务
tx, err := db.Begin()
if err != nil {
	log.Fatal(err)
}

// 在事务中执行操作
if _, err = tx.Create("user", map[string]interface{}{
	"username": "tx_user",
	"password": "tx_pass",
}); err != nil {
	tx.Rollback()
	log.Fatal(err)
}

// 提交事务
if err = tx.Commit(); err != nil {
	log.Fatal(err)
}

3. 订阅实时更新

// 创建订阅通道
events, err := db.Live("user")
if err != nil {
	log.Fatal(err)
}

// 处理实时事件
go func() {
	for event := range events {
		fmt.Printf("实时事件: %+v\n", event)
	}
}()

// 在另一个goroutine中修改数据会触发事件
go func() {
	_, err := db.Create("user", map[string]interface{}{
		"username": "event_user",
	})
	if err != nil {
		log.Println(err)
	}
}()

错误处理

// 检查特定错误类型
if surrealdb.IsConnectionError(err) {
	fmt.Println("连接错误:", err)
} else if surrealdb.IsQueryError(err) {
	fmt.Println("查询错误:", err)
} else if err != nil {
	fmt.Println("其他错误:", err)
}

性能优化建议

  1. 使用连接池管理数据库连接
  2. 批量操作时尽量使用事务
  3. 合理设计数据模型和索引
  4. 对于频繁查询可以考虑使用缓存

总结

surrealdb.go 驱动提供了简洁的API来操作SurrealDB数据库,支持基本的CRUD操作、事务处理和实时订阅等功能。通过结构体绑定可以更方便地处理数据,而错误处理机制帮助开发者构建健壮的应用程序。

SurrealDB作为新兴数据库,其Go驱动仍在不断发展中,建议定期关注GitHub仓库以获取最新功能和改进。

回到顶部