通过SQL访问向量数据库

更新时间:

开启向量引擎优化功能后,您可以通过SQL接口访问云原生数据仓库AnalyticDB PostgreSQL版向量数据库。本文介绍使用Java、Python和C语言三种客户端的接入方式。

Java

云原生数据仓库AnalyticDB PostgreSQL版向量数据库支持使用PostgreSQL或Greenplum的JDBC驱动包连接。JDBC连接数据库的操作,请参见JDBC

在确保有PostgreSQL JDBC驱动的前提下,如果您使用Maven,可以在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.5</version>
</dependency>

通过Java代码访问向量数据库的示例代码如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class GreenplumSample {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://yourhost:yourport/yourdbname";
        String user = "yourusername";
        String password = "yourpassword";

        try {
            // 加载驱动
            Class.forName("org.postgresql.Driver");
            // 创建连接
            Connection con = DriverManager.getConnection(url, user, password);
            // 创建语句
            Statement st = con.createStatement();
            // 执行查询
            String query = "SELECT * FROM yourtable LIMIT 10";
            ResultSet rs = st.executeQuery(query);
            // 处理结果
            while(rs.next()) {
                // 假设知道结果集中至少有一列,且为字符串类型
                String resultColumn = rs.getString(1);
                System.out.println(resultColumn);
            }
            // 关闭资源
            rs.close();
            st.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Python

云原生数据仓库AnalyticDB PostgreSQL版向量数据库可以使用psycopg2工具连接,并通过Python代码导入和查询向量数据。psycopg2连接数据库的操作,请参见Python

通过python代码访问向量数据库的示例代码如下:

import psycopg2
from psycopg2 import pool

# 创建连接池
connection_pool = psycopg2.pool.SimpleConnectionPool(
    minconn=1,
    maxconn=10,
    user='your_username',
    password='your_password',
    host='your_host',
    port='your_port',
    database='your_database'
)

# 连接探活检查
def is_connection_alive(conn):
    try:
        conn.cursor().execute("SELECT 1")
    except (psycopg2.OperationalError, psycopg2.InterfaceError):
        return False
    return True

# 从连接池获取连接对象
def get_connection():
    conn = connection_pool.getconn()
    while not is_connection_alive(conn):
        conn = connection_pool.getconn()
    return conn

# 将连接对象放回连接池
def release_connection(conn):
    connection_pool.putconn(conn)

# 使用连接对象执行查询
def execute_query(query):
    conn = get_connection()
    cursor = conn.cursor()
    try:
        cursor.execute(query)
        if query.startswith("SELECT"):
            result = cursor.fetchall()
        else:
            conn.commit()
            result = None
    except (psycopg2.DatabaseError, psycopg2.InterfaceError) as e:
        print(f"Error executing query: {e}")
        conn.rollback()
        result = None
    cursor.close()
    release_connection(conn)
    return result

# 示例查询
# 查询
select_query = "SELECT * FROM your_table"
result = execute_query(select_query)
if result:
    print(result)

# 插入
insert_query = "INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2')"
execute_query(insert_query)

# 更新
update_query = "UPDATE your_table SET column1 = 'new_value' WHERE column2 = 'value2'"
execute_query(update_query)

# 删除
delete_query = "DELETE FROM your_table WHERE column1 = 'value1'"
execute_query(delete_query)

C

云原生数据仓库AnalyticDB PostgreSQL版向量数据库可以使用libpg库连接,并使用C语言代码导入和查询向量数据。libpg连接数据库的操作,请参见libpq

通过C语言代码访问向量数据库的示例代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>

int main() {
    const char *conninfo;
    PGconn *conn;
    PGresult *res;
    int nFields;
    int i, j;

    // 设置连接字符串
    conninfo = "dbname=yourdbname user=yourusername host=yourhostname port=yourport password=yourpassword";

    // 创建连接
    conn = PQconnectdb(conninfo);

    // 检查状态
    if (PQstatus(conn) != CONNECTION_OK) {
        fprintf(stderr, "连接失败: %s", PQerrorMessage(conn));
        PQfinish(conn);
        exit(1);
    }

    // 执行一个查询
    res = PQexec(conn, "SELECT * FROM yourtablename LIMIT 10");

    // 检查是否正常返回了结果集
    if (PQresultStatus(res) != PGRES_TUPLES_OK) {
        fprintf(stderr, "SELECT命令未返回数据: %s", PQerrorMessage(conn));
        PQclear(res);
        PQfinish(conn);
        exit(1);
    }

    // 获取字段数
    nFields = PQnfields(res);

    // 打印每一行
    for (i = 0; i < PQntuples(res); i++) {
        for (j = 0; j < nFields; j++) {
            printf("%s = %s", PQfname(res, j), PQgetvalue(res, i, j));
        }
        printf("\n");
    }

    // 清理
    PQclear(res);

    // 关闭连接
    PQfinish(conn);

    return 0;
}

相关文档

如果有更多其他语言客户端的使用需求,请参见pgvector兼容模式使用指南