现象
使用FastGPT main分支(20240102版本)源码启动时,PG数据库初始化抛出报错:CREATE INDEX CONCURRENTLY cannot run inside a transaction block,报错日志指向packages/service/common/vectorStore/pg/controller.ts文件的initPg函数。
可能原因
当前初始化代码中,CREATE INDEX CONCURRENTLY语句与其他DDL语句在同一数据库事务上下文中执行,而PostgreSQL数据库不允许在事务块内运行CREATE INDEX CONCURRENTLY命令。
排查步骤
- 查看报错日志,定位到
packages/service/common/vectorStore/pg/controller.ts的initPg函数。 - 检查该函数内的数据库查询语句,确认
CREATE INDEX CONCURRENTLY语句与其他DDL语句在同一批查询或事务中执行。 - 结合PostgreSQL官方规则,验证
CREATE INDEX CONCURRENTLY无法在事务块内运行。
解决与验证
- 修改
packages/service/common/vectorStore/pg/controller.ts中的initPg函数,将创建索引的语句与建表语句拆分为两个独立的PgClient.query调用,参考修复代码:
export async function initPg() {
try {
await connectPg();
await PgClient.query(`
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE IF NOT EXISTS ${PgDatasetTableName} (
id BIGSERIAL PRIMARY KEY,
vector VECTOR(1536) NOT NULL,
team_id VARCHAR(50) NOT NULL,
tmb_id VARCHAR(50) NOT NULL,
dataset_id VARCHAR(50) NOT NULL,
collection_id VARCHAR(50) NOT NULL,
data_id VARCHAR(50) NOT NULL,
createTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
`);
await PgClient.query(`
CREATE INDEX CONCURRENTLY IF NOT EXISTS vector_index ON ${PgDatasetTableName}
USING hnsw (vector vector_ip_ops) WITH (m = 32, ef_construction = 64);
`);
console.log('init pg successful');
} catch (error) {
console.log('init pg error', error);
}
}- 重新启动FastGPT源码服务,查看控制台是否输出
init pg successful提示。 - 连接目标PostgreSQL数据库,验证
vector_index索引已创建,且${PgDatasetTableName}表存在且结构符合预期。