栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

pg-promise返回整数作为字符串

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pg-promise返回整数作为字符串

历史上一直在积淀很多东西。但是,如果您使用的是Node.js v10.4.0或更高版本,则可以跳过所有步骤,然后跳到

UPDATe-2
底部的部分。


这确实是标准行为。

bigint
是64位,并且所有64位整数都由底层的node-postgres驱动程序作为type
string
返回,而32 位整数则作为返回
number

原因是64位整数在Javascript中没有确切的本机表示形式,它只能以一定的精度显示64位数字,并且不适合表示64位数字的全部范围。


有三种可能的解决方案,请选择一种最适合您的解决方案:

解决方案1

不要使用64位整数来存储Id-s,如果您的表预计不会有超过40亿条记录,请改用默认

int
类型32位,它将自动以整数形式返回。

解决方案2

即时将返回的id转换为整数,但请记住,一旦id达到足够高的数字(53位),转换后的值就会失真/更改。

但是,您可以使用专用的库,该库可以将字符串正确地转换为64位整数(请参见上面的链接),但是在查询中使用时可能很麻烦。


即时转换id的示例:

db.each('SELECT id_brand FROM catalog_brand WHERe id_brand in ($1:csv)', [ids], cat=> {    cat.id_brand = parseInt(cat.id_brand)})    .then(rows => {        // id_brand is now an integer in each row    });

参见Database.each。

再举一个例子,记录计数总是返回为

bigint
,因此获取这些记录的最佳方法是通过内联值转换+转换,如下所示:

db.one('SELECt count(*) FROM catalog_brand', [], c => +c.count)    .then(count => {        // count = a proper integer value, rather than an object with a string    });

请参阅Database.one。

解决方案3

您可以使底层的node-postgres驱动程序忽略转换安全性,并将此类类型转换为无处不在的整数。我不能说这通常是否是一个好主意,只能通过

pgp.pg.types.setTypeParser(...)
(请参阅pg-
types
)轻松完成:

// Convert bigserial + bigint (both with typeId = 20) to integer:pgp.pg.types.setTypeParser(20, parseInt);

更新1

pg-promise
通过Typescript 使用v9或更高版本时,可以用以下代码替换上面的代码:

pgp.pg.types.setTypeParser(TypeId.INT8, parseInt);

请注意,解决方案2和3做相同的事情,但是在两个不同的级别上:

  • 解决方案2中的显式本地转换
  • 解决方案3中的隐式全局转换

更新2

该库的9.3.0版添加了对本机BigInt类型的支持,如果您正在运行Node.js
v10.4.0或更高版本,则现在可以使用该类型。

为了使驱动程序自动将BigInt用于

BIGINT
+
BIGSERIAL

pgp.pg.types.setTypeParser(20, BigInt); // Type Id 20 = BIGINT | BIGSERIAL

有关更多详细信息,请参见项目的WiKi中的BigInt手册。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/469119.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号