使用pg-promise查询时报表不存在但数据库表实际存在如何解决
问题根因
PostgreSQL 对标识符的大小写有特殊规则:如果建表时没有给表名加双引号,PostgreSQL 会自动将标识符转为小写存储;如果建表时使用了大写表名或给表名加了双引号,后续查询时必须严格匹配大小写,同时给表名加双引号才能命中。
从你提供的psql输出可以看到,表名实际为大写开头的Test,所以直接写test查询会找不到对应表。
解决步骤
- 修正SQL语句的表名写法,注意JS字符串中的双引号转义
推荐使用模板字符串包裹SQL,避免额外转义:
- 修正SQL语句的表名写法,注意JS字符串中的双引号转义
// 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)
- 验证数据库连接是否正确
如果修改后依然报错,可以先执行以下测试代码,确认程序连接的库、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);
- 最佳实践建议
后续建表时建议统一使用小写加下划线的命名规则,避免大小写区分带来的额外适配成本,比如将表名改为test而非Test。
- 最佳实践建议
内容的提问来源于stack exchange,提问作者Adam Zerner
相关产品推荐
相关产品推荐

