You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:08:32