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

2023-12-05

我对包含类型列的表进行了这个简单的查询bigint.

然而当我查询它时,pg-承诺以字符串形式返回该列的值。我在文档中找不到相关信息。这是标准行为吗?

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-承诺返回实际类型?


下面有很多历史积累的内容。但如果您使用 Node.js v10.4.0 或更高版本,您可以跳过所有这些,并跳到部分UPDATE-2在底部。


这确实是标准行为。

bigint是64位的,所有64位整数都是底层返回的节点 postgres驱动程序作为类型string,而 32 位则返回为number.

原因是64位整数在JavaScript中没有精确的原生表示,它只能以一定的精度表示64位数字,并且不适合表示全范围的64位数字。

也可以看看:如何在 Node.js 中进行 64 位整数运算?


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

解决方案1

不要使用 64 位整数来存储 Id-s,如果您的表预计不会有超过 40 亿条记录,请使用默认值inttype 而是 32 位,并且会自动以整数形式返回。

解决方案2

将返回的 id-s 即时转换为整数,但请记住,一旦您的 id-s 达到足够高的数字(53 位),转换后的值将被扭曲/更改。

不过,您可以使用专门的库来正确地将字符串转换为 64 位整数(请参阅上面的链接),但这在跨查询中使用可能会很尴尬。


即时转换 id-s 的示例:

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
    });

See 数据库.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
    });

See 数据库.一.

解决方案3

你可以做底层节点 postgres驱动程序忽略转换安全性并将此类类型到处转换为整数。我不能说这总体上是否是一个好主意,只是可以通过以下方式轻松完成pgp.pg.types.setTypeParser(...) (see pg-types):

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

UPDATE-1

使用时pg-promisev9 或更高版本通过 TypeScript,您可以将上面的代码替换为:

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

请注意,解决方案 2 和 3 执行相同的操作,但在两个不同的级别上:

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

UPDATE-2

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

让驱动程序自动使用BigInt for BIGINT + BIGSERIAL:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pg-promise 将整数作为字符串返回 的相关文章

  • 动态更改温斯顿的日志级别

    我尝试在运行时实现日志级别更改 我一直在关注https github com yannvr Winston dynamic loglevel blob master test https github com yannvr Winston
  • 使用 Express.js 和 NodeJS,您可以通过响应正文中的重定向发送 JSON

    我正在尝试通过 302 重定向发送 JSON 在 ExpressJS 中这可能吗 API 声明可以添加主体res json 例如 res json 302 name larry 在接收端 重定向的目的地 主体是空的 这是一些示例代码 发送应
  • 使用 Socket.io 向多个房间发送消息?

    是否可以使用socket io向多个房间发送消息 发送至 1 个房间 io sockets in room emit id 发送到N个房间 io sockets in room1 room2 roomN emit id 是的 可以同时发送到
  • dyld:惰性符号绑定失败

    当我尝试运行时遇到一个奇怪的错误gatsby develop在新创建的 gatsby 项目中 这不应该与 gatsby js 静态站点生成器 有任何关系 因为我在不同的场合也遇到了相同的错误 当我跑步时gatsby develop在我的一个
  • 如何将对象数组传递给jade模板?

    我想将一组对象从 mongodb 传递到客户端 这是物体 var objeto img name name of the file image image jpg url title title of the image caption d
  • 未捕获的 ReferenceError:未定义角度 - Mean.IO

    我已遵循安装步骤 http mean io docsmean io 但是当我浏览 localhost 3000 时 我得到一个空白页面 当我打开控制台时 我得到一个指向相同错误的文件列表 未捕获的引用错误 角度未定义 我的问题是类似的to
  • 将消息从 AWS Lambda 发布到 AWS IoT

    我正在尝试使用 Nodejs 将消息从 AWS Lamba 发布到 AWS IoT 我已压缩该项目并上传到 AWS IoT 下面是代码片段 var awsIot require aws iot device sdk var device a
  • GraphQL 预期可迭代,但未找到字段 xxx.yyy 的迭代

    我目前正在尝试使用 NodeJS 进行 GraphQL 但我不知道为什么以下查询会出现此错误 library name user name email 我不确定是否type of my resolveLibrary是对的 因为在任何例子中我
  • 如何从此 AWS SecretsManager JSON 对象中提取字段?

    我正在使用 AWS Secrets Manager 来保护 REST API 的数据库信用 我正在使用 AWS Lambda API 网关和 RDS MySQL 以下是我如何获得它们 Load the AWS SDK var AWS req
  • @mailchimp/mailchimp_marketing/types.d.ts'不是nodeJs中的模块

    我在 NodeJS 应用程序中导入了 import mailchimp mailchim marketing import mailchimp from mailchimp mailchimp marketing 但是 它给出以下错误 ty
  • 如何阻止 Node.js 服务器崩溃

    我是节点js新手 我试图创建一个简单的 HTTP 服务器 我按照著名的例子创建了一个 Hello World 服务器如下 var handleRequest function req res res writeHead 200 res1 e
  • 如何在node.js中存根process.env?

    我想存根process env FOO with bar var sinon require sinon var stub sinon stub process env FOO bar 我很困惑 我阅读了文档 但仍然不明白 sinonjs
  • express-hbs 实例 registerAsyncHelper 奇怪的哈希值

    我正在使用express hbs nodejs模块 但在使用时遇到问题registerAsyncHelper 我需要在限制范围内编译布局 因为我创建了一个新的 Handlebars 实例 并在该实例中创建了一个助手 但是当我编译布局时 它返
  • 如果没有“new”,则无法调用类构造函数

    感谢这个问题已经被问过几次了 但是我遇到的几乎所有情况都是有人试图扩展非本地类的情况 我的情况有所不同 我有一个非常简单的基类 名为CObject如下 export class CObject extends BaseObject cons
  • Nodejs 中的子域

    如何处理nodejs的子域请求 例如以下代码回显test在控制台中的任何请求http localhost 9876 任何内容 http localhost 9876 5Banything 5D var http require http h
  • Nodejs 调试生产中的错误

    我有一个在生产环境中运行的 Nodejs 脚本 我不太可能 千分之一 遇到这样的错误 TypeError value is out of bounds at checkInt buffer js 1009 11 at Buffer writ
  • 全局传递 xhr onload 函数的值

    在我正在创建的应用程序中 我有以下 XMLHttpRequest 并且我正在尝试传递结果data在 的里面xhr onload 到在同一父函数中创建的数组中 var url http api soundcloud com resolve j
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • Jwt 签名和前端登录身份验证

    我有这个特殊的 jwt sign 函数 Backend const token jwt sign id user id process env TOKEN SECRET expiresIn 1m res header auth token

随机推荐

  • 当调用 Activity 被销毁时,Android 新 Activity 上的 getIntent 为 NULL

    你们有解决以下问题的方法吗 在注册活动的 onDestroy 中 当用户按下后退按钮时 我调用一个新活动 以便用户可以输入当天的一些最终生产数据 然后通过电子邮件发送报告 问题是 在刚刚启动的活动中 对 getIntent 的调用返回 nu
  • 删除表中过滤的行而不是整个行

    过滤表格时 如何仅删除表格行而不删除整个工作表行 Dim TradeTable As Excel ListObject Set TradeTable Sheets Pre Trade ListObjects PreTradeTable On
  • 如何在 git 中强制执行作者/提交者身份验证?

    目前我们的项目中使用git进行版本控制 开发环境是内网 带有AD的Windows服务器 无法访问Internet 有没有办法配置 git 以使用作者和提交者的开发者域登录名 我们希望阻止开发人员自己提供这些信息 我在谷歌搜索这个问题时发现了
  • iPhone中非系统字体的名称

    我想向我的 iPhone iPad 应用程序添加非系统字体 我已将字体文件添加到项目中 并将字体添加到UIAppFontsinfo plist 的属性 加载我正在使用的字体fontWithName of UIFont 但是name字体的名称
  • 使用 nvd3 库显示单系列多条形图

    Does anyone know how I would go making a multi bar graph to be single series In a working example that i ve seen of how
  • C:为什么我们要包含声明但不定义的头文件?

    在较高的层面上 我知道我们使用 include使其他文件中的代码可用于当前文件的语句 但我不明白为什么我们要包含一个头文件 其中包含声明但没有定义 也许我需要更多地了解编译 链接过程才能完全理解其机制 但是是否有一个我一开始就未能掌握的高级
  • ASP.Net Web API OData - 消费者可以自由地查询他们想要的任何内容?

    我刚刚阅读了有关 OData 查询的 ASP Net Web API 支持的内容 并且在协调查询过滤的外部暴露方面遇到了麻烦 这本质上为集成商提供了向数据库抛出任意查询过滤器的能力 而不考虑最佳查询计划 不应查询的字段等等 如何清理 ODa
  • 截断小数不四舍五入[重复]

    这个问题在这里已经有答案了 可能的重复 c 如何将小数值四舍五入到小数点后两位 用于页面上的输出 我想像下面这样截断小数 i e 2 22939393 gt 2 229 2 22977777 gt 2 229 您可以使用数学轮 decima
  • 角度 $interval 在超过“count”参数后是否会自行取消?

    关于 Angular 中的 interval 服务的快速问题 查看文档 间隔 它们警告您手动取消间隔 但您可以选择在初始化时提供计数参数 一旦计时器 滴答作响 超过了分配的计数 它会自行取消还是只是停止调用该函数并在后台继续运行 TL 博士
  • 带有深思熟虑的冠层的 scipy

    我正在评估 Enthought 包 我安装了32位canopy 从下载https www enthought com downloads 在Ubuntu中 sudo bash canopy 1 0 1 rh5 32 sh 经过测试我没有看到
  • Symfony 在预持久上将数据添加到对象

    我有一个用于创建文档的表格 一方面 我可以添加名称和描述 在旁边我可以选择一个或多个机构创建的文档属于谁 每个机构被分配一个specific市场 一共有7个市场 所以一个市场可以有多个代理机构 但一个代理机构只能属于一个市场 我想要实现的是
  • 如何使用c++运行批处理文件?

    如何使用c 运行批处理文件 我对此一无所知 请参阅 system 函数 http www cplusplus com reference clibrary cstdlib system
  • 将函数保留在头文件中还是源文件中更好

    是将函数保留在头文件中并将它们包含到主源文件中更好 还是将函数保留在源文件中并将它们链接到主源文件中更好 一些库将函数保存在单独的源文件中 这些源文件在特殊的头文件中声明 当您将该头文件包含在主源文件中时 您就链接了所有这些函数 但是 它为
  • ActionBarSherlock 不支持浅色主题警报对话框?

    正如标题所说 我正在使用 actionBarSherlock 库和浅色主题 有时我需要使用alertDialog Builder 类显示一个对话框 问题是 无论我尝试什么 主题都不适用于对话框本身 该主题应该适用于新 API 和旧 API
  • 如何在 Ubuntu 14.04 x64 上安装 Theano 并配置它以使用 GPU?

    我尝试按照以下说明进行操作在当前 Ubuntu 上轻松安装优化的 Theano但它不起作用 每当我使用 GPU 运行 Theano 脚本时 它都会给我错误消息 CUDA已安装 但设备gpu不可用 错误 无法获取可用gpu的数量 未检测到支持
  • 干净的 C++ 粒度朋友等效吗? (答案:律师-委托人习语)

    为什么C 有public任何人都可以呼叫的成员以及friend暴露的声明all private会员到given外部类或方法 但不提供向给定调用者公开特定成员的语法 我想用一些例程来表达接口 这些例程只能由已知的调用者调用 而不必授予这些调用
  • Facebook 应用“通过 {APP_NAME}”重定向到现有页面

    我在 Facebook 上创建了一个应用程序 多亏了这个应用程序 用户可以在他们的墙上发布 一切正常 但我想指定一个当用户点击出版物上的 通过 APP NAME 链接时重定向到的网址 目前 它正在重定向到https www facebook
  • 如何在java中发出curl请求

    这是我的卷曲请求 curl X POST header Content Type application x www form urlencoded header Accept application json header apikey
  • C# 播放多个wav文件

    我有一个应用程序 当按下或单击某个键或按钮时 我需要播放 wav 文件 我使用 SoundPlayer 类 但是当我尝试同时播放另一个 wav 文件时 正在播放的文件会停止 有没有办法同时播放多个wav文件 如果是这样 您能给我示例或教程吗
  • pg-promise 将整数作为字符串返回

    我对包含类型列的表进行了这个简单的查询bigint 然而当我查询它时 pg 承诺以字符串形式返回该列的值 我在文档中找不到相关信息 这是标准行为吗 var ids 180 120 db any SELECT id brand brand f