Go SDK对接向量数据库

本文介绍如何使用Go语言调用openGauss向量数据库。

环境要求

  • 安装Go 1.19及以上版本。

安装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
}

用例

func main() {
    fmt.Println("test")
    connStr := "host=YourIP port=YourPort user=YourUserName password=YourPassWord dbname=YourDBName sslmode=disable"
    dbClient, err  := client.CreateDBClient(connStr)
    if err != nil {
        log.Fatal(err)
    }
    err = client.CreateTable(dbClient, 3)
    err = client.CreateIndex(dbClient)

    data := client.TableData{
        Id: 1,
        Content: "test",
        Vector: "[1,2,3]",
    }

    err = client.InsertDataSingle(dbClient, data)

    data := client.TableData{
        Id: 11,
        Content: "test1",
        Vector: "[3,4,5]",
    }
    err = client.InsertDataSingle(dbClient, data)

    data := client.TableData{
        Id: 10,
        Content: "test3",
        Vector: "[2,2,2]",
    }
    err = client.InsertDataSingle(dbClient, data)

    err = client.DeleteData(dbClient)

    err = client.UpdateData(dbClient, "[3,3,3]")

    vectors := client.FindNearestVectors(dbClient, 1, "[3,2,4], 5")

    fmt.Print(vectors)
}

更多操作示例参考

意见反馈
编组 3备份
    openGauss 2025-07-20 07:43:26
    取消