当前位置: 首页 > 面试题库 >

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

斜高翰
2023-03-14
问题内容

我对包含type列的表进行了此简单查询bigint

但是,当我查询它时,pg-promise将该列的值作为字符串返回。我在文档中找不到有关此信息。那是标准行为吗?

var ids = [180, 120];

db.any('SELECT id_brand, brand from catalog_brand WHERE id_brand in ($1:csv)', [ids])
    .then((data) => {
        // return results
    });

data 采用以下形式,其中id作为字符串而不是int:

[{id_brand: "180", brand: "Ford"}, {id_brand: "120", brand: "Nike"}]

有什么指示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手册。



 类似资料:
  • 我想创建一个静态方法Static String displayArray(int[]数组),它以整数数组为参数,使用循环创建并返回一个新的String,该String表示用大括号包围并用逗号分隔的数组的内容。例如, 我的解决方案: 但其输出如下:

  • GETRANGE key start end 返回key 中字符串值的子字符串,字符串的截取范围由start 和end 两个偏移量决定(包括start 和end 在内)。可以使用负值,字符串右面下标是从-1开始的。 注意返回值处理: 1: start>=length, 则返回空字符串 2: stop>=length,则截取至字符结尾 3: 如果start 所处位置在stop右边, 返回空字符串

  • 123 但是我想要像这样的整个字符串 编辑:添加了,但响应相同。

  • 问题内容: 有没有一种方法可以将以下结果转换为数组? 这将仅返回一列,但是数据类型不是数组。 编辑:我正在使用PostgreSQL 9.1.4 更新:我需要等效于以下SQL语句,而无需编写适用于每个表的列名: 问题答案: 可能是这样的:http ://www.sqlfiddle.com/#!1/d41d8/ 364 工作原理(由内而外),分5个步骤: 第一个: 样本输出: 第二名: 样本输出: 第

  • 我使用的是Laravel,并有一个查询,它使用列的进行选择: 我已经安装了mysqldn,AFAIK Laravel使用。 但是是一个字符串,不管列是什么类型。(它是一个整数列) 另外,如果我这样做: < code>foo_bar以整数形式返回。

  • 问题内容: 我遇到了我不了解的Go行为。我的想法是导入一个插件,该插件实现了两个软件包都没有的接口。如果返回一个结构,它可以正常工作,但是要确保它实现了该接口,我想返回一个失败的接口。 接口定义: 主程序如下所示: 插件(存储在pg / test.go中) 我尝试了每个功能。 返回的函数将输出预期的输出: 其他功能结束于 有人可以解释为什么这不可能吗?如果在这种情况下不让您构建插件,那么创建插件会