登录
首页 >  Golang >  Go问答

使用 Golang 从 PostgreSQL 数据库中选择数百万行数据,如何实现像 Node.js 中的可读流一样操作

来源:stackoverflow

时间:2024-02-28 12:00:24 319浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《使用 Golang 从 PostgreSQL 数据库中选择数百万行数据,如何实现像 Node.js 中的可读流一样操作》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我有大约 5000 万行的 postgresql 表,我想编写 go 代码从该表中选择大约 100 万行,并以有效的方式处理它们。

上次我使用nodejs和这个npm模块pg-query-stream来生成找到的可读记录流,因此我可以像处理任何可读对象流一样处理它们。

这里我发布了我用来处理数据的简化代码:

const pg = require('pg');
const QueryStream = require('pg-query-stream');

 
//pipe 1,000,000 rows to stdout without blowing up your memory usage
pg.connect((err, client, done) => {
  if (err) throw err;
  const query = new QueryStream('SELECT * FROM generate_series(0, $1) num', [1000000]);
  const stream = client.query(query);
  //release the client when the stream is finished
  stream.on('end', done);
  stream.on('data', function(data) { 
    stream.pause();
    funcDoSomethingWithDataAsync(data, function(error) {
      if(error) throw error;
      stream.resume();
    });
 };
})

如何在 go 中模拟可读的数据库记录流? go 中的 sql.scanner 是否可以像 nodejs 模块一样处理流式查询结果?

我已经优化了可以正常工作的查询,我只想将查询执行结果流式传输到 go,就像在 nodejs 库中完成的那样。


解决方案


是的,它的工作原理非常相似:执行查询,迭代结果。下面是一个使用 lib/pq 的简单示例,它是 database/sql 的 postgres 版本。

生成 Query,然后迭代 Rows

rows, err := db.Query(`SELECT * FROM generate_series(0, $1) num`, 1000000)
if err != nil {
   panic(err)
}
 
defer rows.Close()
for rows.Next() {
    var num int
 
    err = rows.Scan(&num)
    if err != nil {
       panic(err)
    }
 
    fmt.Println(num)
}

以上就是《使用 Golang 从 PostgreSQL 数据库中选择数百万行数据,如何实现像 Node.js 中的可读流一样操作》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>