Go SDK对接向量数据库
本文介绍如何使用Go语言调用openGauss向量数据库。
环境要求
- 安装Go 1.19及以上版本。
- openGauss数据库安装部署 容器镜像安装。
安装SDK
开发者可以运行以下命令安装Go SDK官方仓库,并在项目中导入该包。
安装SDK
go get gitee.com/opengauss/openGauss-connector-go-pq
在项目中导入该包
import (
"database/sql"
_ "gitee.com/opengauss/openGauss-connector-go-pq"
)
基本操作
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
}
意见反馈