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

使用pg-promise查询时报表不存在但数据库表实际存在如何解决

问题根因

PostgreSQL 对标识符的大小写有特殊规则:如果建表时没有给表名加双引号,PostgreSQL 会自动将标识符转为小写存储;如果建表时使用了大写表名或给表名加了双引号,后续查询时必须严格匹配大小写,同时给表名加双引号才能命中。
从你提供的psql输出可以看到,表名实际为大写开头的Test,所以直接写test查询会找不到对应表。

解决步骤

    1. 修正SQL语句的表名写法,注意JS字符串中的双引号转义
      推荐使用模板字符串包裹SQL,避免额外转义:
// app.js 中查询语句修改为
db.one(`SELECT * FROM "Test" WHERE id = $1`, 1)

如果使用普通双引号包裹SQL,需要对表名的双引号做转义:

db.one("SELECT * FROM \"Test\" WHERE id = $1", 1)

如果需要指定schema,可以写成:

db.one(`SELECT * FROM public."Test" WHERE id = $1`, 1)
    1. 验证数据库连接是否正确
      如果修改后依然报错,可以先执行以下测试代码,确认程序连接的库、schema下确实存在目标表:
// 在查询逻辑前加这段代码,打印public下所有表名
db.query(`SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'`)
  .then(tables => console.log('当前public schema下的表列表:', tables))
  .catch(err => console.log('查询表列表失败:', err))

同时可以在database.js中打印连接配置,确认dotenv加载正常:

// database.js 中加一行打印
console.log('数据库连接地址:', process.env.DATABASE_CONNECTION)
const pgp = require("pg-promise")();
const db = pgp(process.env.DATABASE_CONNECTION);
    1. 最佳实践建议
      后续建表时建议统一使用小写加下划线的命名规则,避免大小写区分带来的额外适配成本,比如将表名改为test而非Test。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:24:04