跳转到内容

1.2 安装与连接

从零到一——让 PostgreSQL 在你的机器上跑起来,然后用 Python 连上它


这一节在讲什么?

上一节我们理解了 PostgreSQL 是什么以及为什么 RAG 工程师需要它,这一节我们要动手把它装上并跑起来。PostgreSQL 的安装方式有很多种,从最简单的 Docker 一键启动到从源码编译,我们重点讲 Docker 方式——因为它最干净、最快速、而且自带 pgvector 扩展。装好之后,我们会用 psql 命令行和 Python 两种方式连接数据库,确保你能对 PostgreSQL 进行基本的交互操作。


Docker 方式安装(推荐)

Docker 是安装 PostgreSQL + pgvector 最简单的方式,因为你不需要自己编译 pgvector 扩展——官方提供的 pgvector/pgvector 镜像已经预装好了 pgvector:

bash
# 拉取并启动 PostgreSQL + pgvector
docker run -d \
    --name pgvector-db \
    -p 5432:5432 \
    -e POSTGRES_USER=postgres \
    -e POSTGRES_PASSWORD=mysecretpassword \
    -e POSTGRES_DB=rag_db \
    pgvector/pgvector:pg16

参数解释:

参数含义
-d后台运行(detached mode)
--name pgvector-db容器名称,方便后续管理
-p 5432:5432将容器内的 5432 端口映射到宿主机的 5432 端口
-e POSTGRES_USER=postgres数据库超级用户名
-e POSTGRES_PASSWORD=mysecretpassword数据库密码(生产环境请用强密码)
-e POSTGRES_DB=rag_db自动创建的数据库名
pgvector/pgvector:pg16镜像名,pg16 表示基于 PostgreSQL 16

启动后验证:

bash
# 检查容器是否在运行
docker ps | grep pgvector

# 进入容器内的 psql 命令行
docker exec -it pgvector-db psql -U postgres -d rag_db

# 在 psql 中验证 pgvector 扩展是否可用
SELECT * FROM pg_available_extensions WHERE name = 'vector';

# 如果看到 name | default_version | installed_version | comment
#      vector | 0.7.x           |                   | vector data type and approximate nearest neighbor search
# 说明 pgvector 可用!

数据持久化

上面的 Docker 命令有一个问题——如果你删除容器,所有数据都会丢失。要让数据持久化,需要挂载一个数据卷:

bash
docker run -d \
    --name pgvector-db \
    -p 5432:5432 \
    -e POSTGRES_USER=postgres \
    -e POSTGRES_PASSWORD=mysecretpassword \
    -e POSTGRES_DB=rag_db \
    -v pgvector_data:/var/lib/postgresql/data \
    pgvector/pgvector:pg16

-v pgvector_data:/var/lib/postgresql/data 把 PostgreSQL 的数据目录挂载到 Docker 卷 pgvector_data,这样即使容器被删除,数据仍然保存在卷中。


其他安装方式

macOS:Homebrew

bash
# 安装 PostgreSQL
brew install postgresql@16

# 启动服务
brew services start postgresql@16

# 安装 pgvector 扩展(需要编译)
git clone --branch v0.7.0 https://github.com/pgvector/pgvector.git
cd pgvector
make
make install  # 可能需要 sudo

Linux:apt(Ubuntu/Debian)

bash
# 安装 PostgreSQL
sudo apt install postgresql-16

# 安装 pgvector
sudo apt install postgresql-16-pgvector

云托管

如果你不想自己管理服务器,各大云厂商都提供 PostgreSQL 托管服务。需要注意的是,不是所有云托管服务都支持 pgvector 扩展——你需要确认该服务允许安装自定义扩展:

云服务pgvector 支持说明
AWS RDS PostgreSQL从 15.4+ 版本开始支持
Azure Database for PostgreSQL灵活服务器模式支持
阿里云 RDS PostgreSQL需要在控制台手动安装扩展
Google Cloud SQL从 PostgreSQL 14+ 支持

用 psql 连接数据库

psql 是 PostgreSQL 自带的命令行客户端,它是调试和学习 SQL 的最佳工具:

bash
# 连接本地数据库
psql -h localhost -p 5432 -U postgres -d rag_db

# 或者通过 Docker 进入
docker exec -it pgvector-db psql -U postgres -d rag_db

连接成功后你会看到 rag_db=# 提示符,可以输入 SQL 命令:

sql
-- 查看当前数据库
SELECT current_database();

-- 列出所有表
\dt

-- 创建 pgvector 扩展
CREATE EXTENSION vector;

-- 验证扩展已安装
\dx

-- 退出 psql
\q

psql 的常用元命令(以 \ 开头,不是 SQL):

命令作用
\l列出所有数据库
\dt列出当前数据库的所有表
\d table_name查看表结构
\dx列出已安装的扩展
\du列出所有用户
\q退出 psql
\?查看所有元命令帮助

用 Python 连接数据库

在 RAG 应用中,你不会手动在 psql 里敲 SQL——你需要用 Python 代码来操作数据库。最常用的 PostgreSQL Python 驱动是 psycopg2

bash
# 安装依赖
pip install psycopg2-binary pgvector

基本连接

python
import psycopg2

# 建立连接
conn = psycopg2.connect(
    host="localhost",
    port=5432,
    database="rag_db",
    user="postgres",
    password="mysecretpassword"
)

# 创建游标
cur = conn.cursor()

# 执行 SQL
cur.execute("SELECT version();")
version = cur.fetchone()
print(f"PostgreSQL 版本: {version[0]}")

# 关闭连接
cur.close()
conn.close()

注册 pgvector 类型

为了让 psycopg2 正确处理 pgvector 的 vector 类型,你需要注册类型转换器:

python
import psycopg2
from pgvector.psycopg2 import register_vector

conn = psycopg2.connect(
    host="localhost",
    port=5432,
    database="rag_db",
    user="postgres",
    password="mysecretpassword"
)

# 注册 pgvector 类型转换
register_vector(conn)

cur = conn.cursor()

# 创建扩展(如果还没创建)
cur.execute("CREATE EXTENSION IF NOT EXISTS vector;")
conn.commit()

# 验证
cur.execute("SELECT extname, extversion FROM pg_extension WHERE extname = 'vector';")
result = cur.fetchone()
if result:
    print(f"pgvector 已安装: 版本 {result[1]}")
else:
    print("pgvector 未安装")

cur.close()
conn.close()

register_vector(conn) 的作用是告诉 psycopg2:当从数据库读到 vector 类型的数据时,自动把它转换成 Python 的 numpy.ndarray;当向数据库写入 Python 的 list 或 ndarray 时,自动把它转换成 PostgreSQL 的 vector 类型。没有这一步,你需要在 SQL 中手动拼接向量字面量(如 '[0.1, 0.2, 0.3]'::vector(3)),既麻烦又容易出错。

连接池

在生产环境中,你不应该为每个请求都创建新的数据库连接——连接建立的开销很大(TCP 握手 + 认证 + 会话初始化)。正确的做法是使用连接池,预先创建一批连接并复用:

python
from psycopg2 import pool

# 创建连接池
connection_pool = pool.ThreadedConnectionPool(
    minconn=2,       # 最小连接数
    maxconn=10,      # 最大连接数
    host="localhost",
    port=5432,
    database="rag_db",
    user="postgres",
    password="mysecretpassword"
)

# 从池中获取连接
def get_connection():
    conn = connection_pool.getconn()
    return conn

# 用完后归还连接
def release_connection(conn):
    connection_pool.putconn(conn)

# 使用示例
conn = get_connection()
cur = conn.cursor()
cur.execute("SELECT count(*) FROM documents;")
print(f"文档数: {cur.fetchone()[0]}")
cur.close()
release_connection(conn)

常见误区

误区 1:忘记创建 pgvector 扩展

pgvector 安装在 PostgreSQL 中不代表它自动可用——你需要在每个要使用 vector 类型的数据库中手动执行 CREATE EXTENSION vector;。如果忘记这一步,后续创建带 vector 列的表时会报错 type "vector" does not exist

误区 2:连接参数写错导致连接失败

PostgreSQL 默认只监听 localhost。如果你在 Docker 中运行 PostgreSQL,需要确保 -p 5432:5432 端口映射正确。如果连接被拒绝,先检查 Docker 容器是否在运行(docker ps),再检查端口是否正确(lsof -i :5432)。

误区 3:忘记 register_vector 导致向量数据读写异常

如果你用 psycopg2 读写 vector 类型的数据但没有调用 register_vector(conn),可能会遇到 can't adapt type 'numpy.ndarray'type "vector" does not exist 之类的错误。务必在连接建立后立即注册。


本章小结

这一节我们让 PostgreSQL + pgvector 在本地跑了起来,并用 psql 和 Python 两种方式建立了连接。核心要点回顾:第一,Docker 是安装 PostgreSQL + pgvector 最简单的方式,pgvector/pgvector:pg16 镜像预装了 pgvector 扩展;第二,数据持久化需要挂载 Docker 卷,否则删除容器后数据丢失;第三,psql 是调试 SQL 的最佳工具,\dt\dx\d 是最常用的元命令;第四,Python 连接使用 psycopg2,务必调用 register_vector(conn) 注册类型转换器;第五,生产环境使用连接池(psycopg2.pool)复用连接,避免频繁建立和断开连接的开销。

下一节我们将学习 SQL 的增删改查基础——这是操作 PostgreSQL 的基本功,也是后续 pgvector 操作的语法基础。

基于 MIT 许可发布