能否在SQLAlchemy <2.0中使用PGVector?Column替代mapped_column可行性咨询
在SQLAlchemy < 2.0中使用PGVector的解决方案
1. 兼容性说明
可以在SQLAlchemy < 2.0(如1.4.x系列)中使用PGVector,pgvector官方包支持SQLAlchemy 1.4及以上版本,完全适配你的场景,无需升级SQLAlchemy。
2. 使用sqlalchemy.Column替代mapped_column
完全可以通过sqlalchemy.Column定义Vector类型,不需要依赖SQLAlchemy 2.0的mapped_column特性,以下提供两种可行方案:
方案一:直接使用pgvector官方适配的Vector类型
pgvector针对SQLAlchemy提供了现成的类型适配,直接导入使用即可:
from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declarative_base from pgvector.sqlalchemy import Vector # 旧版SQLAlchemy的声明式基类 Base = declarative_base() class Document(Base): __tablename__ = 'documents' id = Column(Integer, primary_key=True) content = Column(String) # 定义维度为1536的向量字段,替换为你的实际维度 embedding = Column(Vector(1536))
方案二:自定义Vector类型(适配你已尝试的CustomTypes)
如果需要更灵活的控制,可以自定义TypeDecorator实现向量类型的转换:
from sqlalchemy import types import psycopg2 from psycopg2.extensions import register_adapter, AsIs import numpy as np from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declarative_base # 注册numpy数组到PostgreSQL vector类型的适配器 def adapt_numpy_array(arr): return AsIs(f"'{arr.tolist()}'::vector") register_adapter(np.ndarray, adapt_numpy_array) class VectorType(types.TypeDecorator): # 底层用String类型存储,实际在数据库中是vector类型 impl = types.String def process_bind_param(self, value, dialect): if value is None: return None # 将列表或numpy数组转为PostgreSQL兼容的vector字符串格式 if isinstance(value, np.ndarray): value = value.tolist() return f"[{','.join(map(str, value))}]" def process_result_value(self, value, dialect): if value is None: return None # 将数据库返回的字符串转为Python列表 return list(map(float, value.strip('[]').split(','))) # 定义模型 Base = declarative_base() class Document(Base): __tablename__ = 'documents' id = Column(Integer, primary_key=True) content = Column(String) embedding = Column(VectorType)
前置要求
- 确保PostgreSQL数据库已安装pgvector扩展:执行
CREATE EXTENSION IF NOT EXISTS vector; - 安装依赖包:
pip install pgvector psycopg2-binary sqlalchemy>=1.4
内容的提问来源于stack exchange,提问作者Łukasz Jankowski
相关产品推荐
相关产品推荐

