如何解决PostgreSQL 8.4.20在Node.js中出现的‘relation "pg_range" does not exist’错误
修复PostgreSQL 8.4.20中"relation pg_range does not exist"错误
错误原因
pg_range是PostgreSQL 9.0才引入的系统表,用于存储范围类型的元数据。你使用的Sequelize版本默认会查询该表,但PostgreSQL 8.4.20不存在这个表,因此触发42P01(未找到关系)错误。
解决方案
1. 降级Sequelize及PostgreSQL驱动到兼容版本
新版本Sequelize(4.x及以上)不再支持PostgreSQL 8.4,需要降级到兼容的旧版本:
- 执行以下命令安装兼容版本:
注:Sequelize 3.x全系列均支持PostgreSQL 8.4,可根据需求调整具体版本号。npm uninstall sequelize pg npm install sequelize@3.30.4 pg@6.4.2
2. 规避PostgreSQL 8.4不支持的特性
- 替换范围类型:如果模型中使用了PostgreSQL的范围类型(如
DATE_RANGE),8.4不原生支持这类类型,需改用替代方案:- 将范围拆分为两个独立字段(如
start_date和end_date); - 用字符串存储范围值,在应用层完成解析逻辑。
- 将范围拆分为两个独立字段(如
- 手动定义字段类型:不要依赖Sequelize的自动类型推断,明确指定每个字段的类型,避免触发对
pg_range的元数据查询。示例:const User = sequelize.define('User', { username: { type: Sequelize.STRING, allowNull: false }, email: { type: Sequelize.STRING, allowNull: false } // 所有字段均明确指定类型,禁用自动检测 });
3. 临时应急:手动创建pg_range视图(不推荐)
如果无法降级依赖或修改代码,可临时创建模拟pg_range的视图,让Sequelize的查询通过:
CREATE VIEW pg_range AS SELECT t.oid AS rngtypid, NULL::oid AS rngsubtype, NULL::oid AS rngcollation, NULL::oid AS rngopcintype, NULL::regproc AS rngopcsubr, NULL::regproc AS rngcanonical, NULL::regproc AS rngsubdiff, NULL::oid AS rngmultirange FROM pg_type t WHERE t.typtype = 'r';
注意:此方法仅能临时解决当前错误,后续可能出现其他兼容性问题,长期建议优先选择前两种方案。
内容的提问来源于stack exchange,提问作者Kamal Muradov
相关产品推荐
相关产品推荐

