惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
量子位
小众软件
小众软件
C
Cybersecurity and Infrastructure Security Agency CISA
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
V
Vulnerabilities – Threatpost
Know Your Adversary
Know Your Adversary
T
Threat Research - Cisco Blogs
Latest news
Latest news
Spread Privacy
Spread Privacy
C
Cyber Attacks, Cyber Crime and Cyber Security
NISL@THU
NISL@THU
T
Tor Project blog
Hacker News: Ask HN
Hacker News: Ask HN
V2EX - 技术
V2EX - 技术
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
K
Kaspersky official blog
Cyberwarzone
Cyberwarzone
博客园 - 叶小钗
博客园 - 聂微东
Last Week in AI
Last Week in AI
爱范儿
爱范儿
腾讯CDC
博客园 - Franky
美团技术团队
J
Java Code Geeks
O
OpenAI News
L
Lohrmann on Cybersecurity
Simon Willison's Weblog
Simon Willison's Weblog
有赞技术团队
有赞技术团队
T
Threatpost
G
GRAHAM CLULEY
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
宝玉的分享
宝玉的分享
I
Intezer
N
News and Events Feed by Topic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
S
Security @ Cisco Blogs
Forbes - Security
Forbes - Security
N
News | PayPal Newsroom
Stack Overflow Blog
Stack Overflow Blog
Scott Helme
Scott Helme
H
Hacker News: Front Page
Cloudbric
Cloudbric

博客园 - 柒零壹

Ubuntu 24.04 安装最新版podman@5.6.1 [转贴]在前端如何玩转 Word 文档 一个命令行参数解决open-webui镜像启动失败的问题(huggingface网站访问失败问题) Go Template 常用疑难知识点 从数据库中随机选取数据(基于golang,xorm) go-ElasticSearch TypedClient学习笔记 go语言如何使用elastic官方客户端go-elasticsearch/v8实现数据批量更新 【转】网络常用颜文字(文字表情) GoCV下实现多图片单窗口内同时显示 解决GoCV/OpenCV不支持中文的问题 golang中xorm自动维护表结构自动导入数据的实现 [golang] gin的中间中调用Abort方法导致的带附件的表单提交时,浏览器报net::ERR_CONNECTION_RESET错误的原因及解决方法 [golang]filepath.Glob的缺陷,不支持多级目录 浏览器中javascript简易实现json数据保存到客户端 最简单搭建前端轻量级项目开发服务 [转]Three.js做一个酷炫的城市展示可视化大屏 [转]css实现不同样式的tooltip对话框小三角 [原]升级项目到Rails7.0.3,使用自己手动方案编译打包css及js资源 puma web server如何监听所有IP地址
golang用pgx查询数据时如何将查询结果方便的放入Map中
柒零壹 · 2023-08-03 · via 博客园 - 柒零壹

pgx库简介

下面是来自官网的简介: pgx - PostgreSQL驱动和工具包

pgx是一个用于PostgreSQL的纯Go语言驱动和工具包。

pgx驱动是一个底层的高性能接口,暴露了PostgreSQL特有的功能,如LISTEN/NOTIFYCOPY。它还包含一个标准database/sql接口的适配器。

工具包组件是一组相关的包,实现了像解析wire协议和PostgreSQL与Go之间的类型映射等PostgreSQL功能。这些底层包可用于实现替代驱动、代理、负载均衡器、逻辑复制客户端等。

pgx应该是目前最好的启动包了,“pg” 另一个著名的PostgreSQL启动包的状态目前仅仅是维护了,并且推荐了pgx。

"对于需要新功能或可靠解决报告中的错误的用户,我们推荐使用正在积极开发中的pgx。" -pq维护人员

pgx比较底层,没有ORM的功能,比如我要将一行查询结果扫描到一个Map中。

近期由于开发一个pg到elastic的复制工具(包括wal增量复制和全量复制),在实现全量复制时,我需要将一行查询结果放到Map中,结果尴尬了,pgx中竟然没有这样的功能,难道我要因此使用gorm或者xorm(虽然也很方便,但是多引入一个包我也不那么愿意),经过询问必应,只得到了,自己声明一堆和字段对应变量然后扫描这样的例子:

 
 

太麻烦了,我忍不了。

pgx有内置的方法

于是我不甘心的仔细查看pgx的文档和实例,终于,我发现了这个方法:

 func pgx.CollectRows(rows pgx.Rows, fn pgx.RowToFunc[map[string]any]) ([]map[string]any, error)
 

但是显然,这个方法是一次性的生成一个map的切片,如果数据量不大还好,但是对于我要用到的全量复制场景就未免不适合了,但是只要有了方向就好了,赶紧跟踪进去,

 

可见上述代码中,仅仅是简单的Next() Scan()然后回调pgx.RowToMap这个函数生成map,我不需要它一次性地给我map的切片,但是我可以轻松将他实现的过程移植到我的代码中,至此问题完美解决了。至于pgx.RowToMap这个方法的实现,其实非常简单,下面就是其源代码:

 

其中19行就是这个属性方法rows.FieldDescriptions()我不知道,否则自己也可以方便地实现扫描到map的方法了。