(二)PosrgreSQL: Python3 连接Pgvector出错排查

news/2025/1/25 2:45:21/

在使用 Python 连接到 PostgreSQL 数据库,特别是当涉及到 pgvector 扩展以处理向量数据时,可能会遇到一些问题。本文针对psycopg2连接pgvector进行插入和查询操作失败问题,分享了一种可行的解决方案。

pgvector_1">1. 安装并启用pgvector扩展

确保PostgreSQL数据库已经安装了 pgvector 扩展,并且该扩展已在你要使用的数据库中启用。你可以通过以下 SQL 命令来启用它:

CREATE EXTENSION IF NOT EXISTS pgvector;

创建启用pgvector的表items

CREATE TABLE items (id SERIAL PRIMARY KEY,embedding vector(3)
);

pythonpgvector_18">2. python脚本操作pgvector

在Python环境中,需要安装python模块psycopg2支持对PostgreSQL的访问。采用(pgvector Tutorial: Integrate Vector Search into PostgreSQL)[https://www.datacamp.com/tutorial/pgvector-tutorial] 所展示的连接pgvecyor的python3代码块进行测试

python">import psycopg2
import numpy as np# Connect to the database
conn = psycopg2.connect("dbname=your_database user=your_username")
cur = conn.cursor()# Insert a vector
embedding = np.array([1.5, 2.5, 3.5])
cur.execute("INSERT INTO items (embedding) VALUES (%s)", (embedding.tolist(),))# Perform a similarity search
query_vector = np.array([2, 3, 4])
cur.execute("SELECT * FROM items ORDER BY embedding <-> %s LIMIT 1", (query_vector.tolist(),))
result = cur.fetchone()
print(f"Nearest neighbor: {result}")conn.commit()
cur.close()
conn.close()

运行python代码抛错如下

---------------------------------------------------------------------------
UndefinedFunction                         Traceback (most recent call last)
Cell In[4], line 1412 # Perform a similarity search13 query_vector = np.array([2, 3, 4])
---> 14 cur.execute("SELECT * FROM items ORDER BY embedding <-> %s LIMIT 1", (query_vector.tolist(),))15 result = cur.fetchone()16 print(f"Nearest neighbor: {result}")UndefinedFunction: operator does not exist: vector <-> integer[]
LINE 1: SELECT * FROM items ORDER BY embedding <-> ARRAY[2,3,4] LIMI...^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.

修改出错行为如下值,再次运行依然报错。

python">cur.execute("SELECT * FROM items ORDER BY embedding <-> %s LIMIT 1", (query_vector,))

错误日志

---------------------------------------------------------------------------
ProgrammingError                          Traceback (most recent call last)
Cell In[5], line 1412 # Perform a similarity search13 query_vector = np.array([2, 3, 4])
---> 14 cur.execute("SELECT * FROM items ORDER BY embedding <-> %s LIMIT 1", (query_vector,))15 result = cur.fetchone()16 print(f"Nearest neighbor: {result}")ProgrammingError: can't adapt type 'numpy.ndarray'

python_pgvector_81">3. 引入python pgvector模块

为了使psycopg2能够支持PostgreSQL中的向量类型,你需要通过pgvector中的register_vector方法,对psycopg2进行注册,可以在SQL语句中支持使用Numpy数组,或者numpy array转换后的列表变量。修改后的代码如下:

python">import psycopg2
import numpy as np
from pgvector.psycopg2 import register_vector# Connect to the database
conn = psycopg2.connect("dbname=postgres user=hbu host=localhost")
register_vector(conn)
cur = conn.cursor()# Insert a vector
embedding = np.array([1.5, 2.5, 3.5])
cur.execute("INSERT INTO items (embedding) VALUES (%s)", (embedding.tolist(),))# Perform a similarity search
query_vector = np.array([2, 3, 4])
cur.execute("SELECT * FROM items ORDER BY embedding <-> %s LIMIT 1", (query_vector,))
result = cur.fetchone()
print(f"Nearest neighbor: {result}")conn.commit()
cur.close()
conn.close()

运行结果如下:

Nearest neighbor: (9, None, None, array([1.5, 2.5, 3.5], dtype=float32))

总结

采用Python操作pgvector表时,主要启用pgvector模块对连接进行而外操作才行。以下是一些注意要点:

  • 确保pgvector扩展已安装并启用
  • 仔细检查代码中的方法名和SQL语句
  • 正确安装和导入Python依赖模块psycopg2和pgvector
  • 使用python模块pgvector中register_vector方法,对创建的psycopg2连接变量进行注册
  • 向量数组一定要numpy类型的(psycopg,psycopg2模块同样要求)
  • 使用numpy array类型,个别情况不需要转换为list(即不需要query_vector.tolist()转换numpy array)

通过以上步骤,我顺利解决连接pgvector 表,查询失败的问题,并成功执行PostgreSQL pgvector向量扩展的插入与查询操作。


http://www.ppmy.cn/news/1565937.html

相关文章

算法刷题笔记——图论篇

这里写目录标题 理论基础图的基本概念图的种类度 连通性连通图强连通图连通分量强连通分量 图的构造邻接矩阵邻接表 图的遍历方式 深度优先搜索理论基础dfs 与 bfs 区别dfs 搜索过程深搜三部曲所有可达路径广度优先搜索理论基础广搜的使用场景广搜的过程 岛屿数量孤岛的总面积沉…

selenium clear()方法清除文本框内容

在使用Selenium进行Web自动化测试时&#xff0c;清除文本框内容是一个常见的需求。这可以通过多种方式实现&#xff0c;取决于你使用的是哪种编程语言&#xff08;如Python、Java等&#xff09;以及你的具体需求。以下是一些常见的方法&#xff1a; 1. 使用clear()方法 clear…

智源研究院与乐聚机器人成立具身智能联合实验室

2025年1月13日&#xff0c;北京智源人工智能研究院&#xff08;简称“智源研究院”&#xff09;和乐聚&#xff08;深圳&#xff09;机器人技术有限公司&#xff08;简称“乐聚机器人”&#xff09;正式达成合作&#xff0c;双方将成立具身智能联合实验室&#xff0c;集中优势资…

U-Net - U型网络:用于图像分割的卷积神经网络

U-Net是一种专为图像分割任务设计的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;最初由Olaf Ronneberger等人于2015年提出。它被广泛应用于医学影像分析、遥感图像分割、自动驾驶和其他许多需要对图像进行像素级分类的任务中。U-Net具有强大的特征提取和恢复能力&…

56.命令绑定 C#例子 WPF例子

一共是两个控件&#xff0c;绑定了属性和命令。用的是最简做法 创建依赖&#xff1a; public class RelayCommand : ICommand{private readonly Action<object> _execute;public event EventHandler CanExecuteChanged;public RelayCommand(Action<object> execut…

uniapp的插件开发发布指南

Hbuilder创建项目 项目根目录创建uni_modules 开发组件 发布到插件市场 填写发布说明&#xff08;未登录需要登录&#xff09; 点击提交 在终端可以看到 发布成功&#xff01; 插件市场查看

认识Django项目模版文件——Django学习日志(二)

1.默认文件介绍 └── djangoproject1/├── djangoproject1/│ ├── urls.py [URL和函数的对应关系]【常用文件】│ ├── settings.py [项目配置文件]【常用文件】│ ├── _init_.py│ ├── wsgi.py [接受网络请求] 【不要动】│ └──…

WPS按双字段拆分工作表到独立工作簿-Excel易用宝

我们老板真是事多&#xff0c;他说要把这个工作表以月份和支付方式的维度&#xff0c;以这两个字段进行拆分工作表&#xff0c;而且拆分出来的表格要保存一个新的工作簿。 啥事都交给我&#xff0c;他还以为我有三头六臂呢&#xff0c;还好我有易用宝&#xff0c;可以轻松拆分…