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

Next.js+PostgreSQL项目SQL查询结果不更新问题求助

问题:Next.js + Vercel Postgres 查询缓存导致新插入数据无法实时获取

场景复现

我用Next.js + Vercel Postgres搭建项目,API路由代码如下:

// api/fetchPostList/route.ts
import { sql, db } from "@vercel/postgres";
import { NextRequest, NextResponse } from 'next/server';

export async function GET(req: NextRequest) {
    try {
        const postListQuery = await sql`SELECT id, title FROM posts;`;
        const postList = postListQuery.rows;
        return NextResponse.json({data: postList}, { status: 200 });
    }
    catch(e){
        return NextResponse.json({data: null}, {status: 500});
    }   
}
  • 初始数据库数据正常,查询返回正确结果;
  • 插入新数据后,原查询仍返回旧数据集;
  • 更换查询字段(如SELECT id, content FROM posts;)后,能获取一次最新数据,但再次插入新数据后,该查询又返回旧结果。

问题原因

这是Vercel Postgres的默认查询缓存机制导致的:相同的SQL语句会被缓存,当数据库数据更新后,缓存未自动失效,因此返回旧数据。更换查询字段时,新的SQL语句不在缓存中,会触发实时查询,所以能拿到最新数据,但后续该新查询也会被缓存,再次插入数据后就又出现问题。

解决方案

1. 禁用单条查询的缓存

在sql查询中通过withOptions禁用缓存:

const postListQuery = await sql`SELECT id, title FROM posts;`.withOptions({ cache: 'no-store' });

2. 在API响应中添加缓存控制头

强制客户端和服务器不缓存该API的响应:

return NextResponse.json({data: postList}, { 
  status: 200,
  headers: {
    'Cache-Control': 'no-store, no-cache, must-revalidate, proxy-revalidate',
    'Pragma': 'no-cache',
    'Expires': '0'
  }
});

3. 使用数据库客户端手动执行查询

绕过sql模板的缓存机制,直接用连接客户端执行查询:

export async function GET(req: NextRequest) {
    try {
        const client = await db.connect();
        const result = await client.query('SELECT id, title FROM posts;');
        const postList = result.rows;
        client.release();
        return NextResponse.json({data: postList}, { status: 200 });
    }
    catch(e){
        return NextResponse.json({data: null}, {status: 500});
    }   
}

内容的提问来源于stack exchange,提问作者user23704397

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:28:19