Node.js查询PostgreSQL数据库时date字段始终返回null
PostgreSQL date类型字段查询返回null问题
我在PostgreSQL中创建了LOR表,建表SQL如下:
create table LOR ( PLR_ID int primary key, visibility int, planning_space text, tessellate int, extrude int, size_m2 real, stand date, area_key int references Bezirkgrenzen (area_key) );
使用Node.js的pg库查询数据时,所有字段都能正常获取,但date类型的stand字段始终返回null。
查询用的JavaScript代码:
var pg = require('pg'); var connectionString = { user: 'postgres', host: 'localhost', database: 'test', password: '123', port: 5432, }; var pool = new pg.Pool(connectionString); pool.connect(function (err, client, done) { const query = client.query(new pg.Query("select * from lor")) query.on('row', (row) => { console.log(row); }) query.on('end', (res) => { // pool shutdown console.log("ending"); pool.end() }) query.on('error', (res) => { console.log(res); }) done() })
查询结果示例:
{ plr_id: 11300616, visibility: -1, planning_space: 'Hohenschönhausener Straße', tessellate: -1, extrude: 0, size_m2: 416963.7, stand: null, area_key: 11 } ending
数据库中对应条目的stand字段存在有效日期值,但查询结果始终为null。
解决办法
1. 排查字段大小写问题
PostgreSQL会自动将未加双引号的标识符转为小写,但如果插入数据时实际使用的是大写列名(比如STAND),select *会映射到小写stand字段,导致返回null。可以尝试显式指定带引号的字段查询:
select "PLR_ID", "visibility", "planning_space", "tessellate", "extrude", "size_m2", "stand", "area_key" from lor
2. 升级pg库版本
旧版pg库存在date类型解析的已知bug,执行npm update pg升级到最新稳定版后重试查询。
3. 显式转换日期为字符串验证
在查询语句中将date字段转为字符串,确认数据库中是否真的有值:
select *, to_char("stand", 'YYYY-MM-DD') as stand_str from lor
如果stand_str能返回有效日期,说明是客户端解析问题,升级库即可解决;如果依然无值,直接在psql中执行select stand from lor where plr_id = 11300616,验证数据库中该字段的实际值。
4. 对齐数据库与客户端时区
时区不匹配可能导致日期解析异常,在连接配置中添加与数据库一致的时区:
var connectionString = { user: 'postgres', host: 'localhost', database: 'test', password: '123', port: 5432, timezone: 'UTC' // 替换为你的数据库时区,比如'Asia/Shanghai' };
内容的提问来源于stack exchange,提问作者Ledrake
相关产品推荐
相关产品推荐

