Go SDK对接向量数据库
本文介绍如何使用Go语言调用openGauss向量数据库。
环境要求
- 安装Go 1.19及以上版本。
安装SDK
开发者可以运行以下命令安装Go SDK官方仓库,并在项目中导入该包。
安装SDK
go get gitcode.com/opengauss/openGauss-connector-go-pq
在项目中导入该包
import (
"database/sql"
_ "gitcode.com/opengauss/openGauss-connector-go-pq"
)
说明:
目前 gitcode 不支持 go get,请参考下方用例指导手动安装。
基本操作
1.连接数据库
// connectInfo格式:
// "host=127.0.0.1 port=5432 user=username password=userpassword dbname=userdbname sslmode=disable"
func CreateDBClient(connectInfo string) (*sql.DB, error) {
return sql.Open("opengauss", connectInfo)
}
2.创建表
func CreateTable(client *sql.DB, dim int) error {
execSql := fmt.Sprintf("CREATE TABLE IF NOT EXISTS demotable(id INTEGER, content TEXT, embedding vector(%d))", dim)
_, err := client.Exec(execSql)
return err
}
3.创建索引
// 用L2距离创建HNSW类型的向量索引
func CreateIndex(client *sql.DB) error {
execSql := fmt.Sprint("CREATE INDEX ON demotable USING hnsw (embedding vector_l2_ops)")
_, err := client.Exec(execSql)
return err
}
4.插入/删除/更新
- 插入
// 单条插入
type TableData struct {
Id int
Content string
Vector string
}
func InsertDataSingle(client *sql.DB, data TableData) error {
execSql := fmt.Sprintf("INSERT INTO demotable VALUES(%d, '%s', '%s')", data.Id, data.Content, data.Vector)
_, err := client.Exec(execSql)
return err
}
- 删除
func DeleteData(client *sql.DB) error {
execSql := fmt.Sprint("DELETE FROM demotable where id > 10")
_, err := client.Exec(execSql)
return err
}
- 更新
func UpdateData(client *sql.DB, vector string) error {
execSql := fmt.Sprintf("UPDATE demotable set embedding = '%s' where id = 10", vector)
_, err := client.Exec(execSql)
return err
}
5.查询
func SearchVectors(client *sql.DB, efsearch int, vector string, topK int) []string {
var res []string
// 设置查询参数
paramsql := fmt.Sprintf("set hnsw_ef_search = %d", efsearch);
querysql := fmt.Sprintf("SELECT * FROM demotable ORDER BY embedding <-> '%s' LIMIT %d;", vector, topK);
_, _ = client.Exec(paramsql)
rows, _ := client.Query(querysql)
for rows.Next() {
var id int
var content string
var vector []byte
_ = rows.Scan(&id, &content, &vector)
embedding := string(vector)
row := fmt.Sprintf("id: %d, content: %s, embedding: %s", id, content, embedding);
res = append(res, row)
}
return res
}
6.删除表
func DropTable(client *sql.DB, tableName string) error {
execSql := fmt.Sprintf("DROP TABLE IF EXISTS %s", tableName)
_, err := client.Exec(execSql)
return err
}
用例指导
- 安装 openGauss-connector-go-pq
# 创建部署脚本
cat << 'EOL' > setup_opengauss_go.sh
#!/bin/bash
# 设置项目名称和驱动信息
PROJECT_NAME="opengauss-go"
MODULE_NAME="opengauss"
DRIVER_MODULE_PATH="gitcode.com/opengauss/openGauss-connector-go-pq"
DRIVER_REPO_URL="https://$DRIVER_MODULE_PATH.git"
DRIVER_VERSION="v1.0.7"
# 获取 GOPATH
GOPATH=$(go env GOPATH)
DRIVER_LOCAL_PATH="$GOPATH/src/$DRIVER_MODULE_PATH"
# 创建项目目录并初始化 go mod
echo "🚀 初始化 Go 项目..."
mkdir -p "$PROJECT_NAME"
cd "$PROJECT_NAME" || exit 1
go mod init "$MODULE_NAME"
# 克隆 openGauss 驱动到本地路径
echo "📦 正在克隆 openGauss Go 驱动..."
mkdir -p "$DRIVER_LOCAL_PATH"
git clone "$DRIVER_REPO_URL" "$DRIVER_LOCAL_PATH"
# 修改 go.mod 添加 require 和 replace
echo "⚙️ 更新 go.mod 文件..."
cat <<EOL2 >> go.mod
require $DRIVER_MODULE_PATH $DRIVER_VERSION
replace $DRIVER_MODULE_PATH => $DRIVER_LOCAL_PATH
EOL2
# 清理模块缓存以确保生效
echo "🧹 清理模块缓存..."
go clean -modcache
# 下载依赖
echo "📥 安装依赖包..."
go get "$DRIVER_MODULE_PATH"
echo "✅ 初始化和依赖安装完成!"
EOL
# 赋予可执行权限
chmod +x setup_opengauss_go.sh
# 执行脚本,开始安装
./setup_opengauss_go.sh
- **使用 Go SDK 连接 openGauss 执行向量操作 **
# 创建main.go,填入一下内容
vim main.go
package main
import (
"fmt"
"log"
"database/sql"
_ "gitcode.com/opengauss/openGauss-connector-go-pq"
)
/*
* 将上述创建、删除等函数复制到此处
*/
func main(){
connStr := "host=YourIP port=YourPort user=YourUserName password=YourPassWord dbname=YourDBName sslmode=disable"
dbClient, err := CreateDBClient(connStr)
if err != nil {
log.Fatal(err)
}
err = DropTable(dbClient, "demotable")
err = CreateTable(dbClient, 3)
err = CreateIndex(dbClient)
data := TableData{
Id: 1,
Content: "test",
Vector: "[1,2,3]",
}
err = InsertDataSingle(dbClient, data)
data = TableData{
Id: 11,
Content: "test1",
Vector: "[3,4,5]",
}
err = InsertDataSingle(dbClient, data)
data = TableData{
Id: 10,
Content: "test3",
Vector: "[2,2,2]",
}
err = InsertDataSingle(dbClient, data)
err = UpdateData(dbClient, "[3,3,3]")
err = DeleteData(dbClient)
vectors := SearchVectors(dbClient, 1, "[3,2,4]", 5)
fmt.Println(vectors)
err = DropTable(dbClient, "demotable")
}
意见反馈