控制SQLX中的查询结果流(延迟/渴望)

时间:2019-07-11 11:39:28

标签: sql postgresql go rds sqlx

我正在使用postgres(aws-rds)实现一个消息表,并使用golang作为后端来查询该表。

创建表:

CREATE TABLE IF NOT EXISTS msg.Messages(
    id SERIAL PRIMARY KEY,
    content BYTEA,
    timestamp DATE
);

这是INSERT查询:

INSERT INTO msg.Messages (content,timestamp) VALUES ('blob', 'date')
RETURNING id;

现在,我希望能够获取特定的消息,如下所示:

特定的SELECT查询:

SELECT id, content,timestamp
FROM msg.Messages
WHERE id = $1

现在让我们说用户长时间离线,他需要从该表中获取很多消息,比如说有1000万条消息,我不想返回所有结果,因为它可能会耗尽应用程序内存。< / p>

每个用户都保存他获取的最后一个message.id,因此查询将为:

SELECT id, content, timestamp
FROM msg.Messages
WHERE id > $1

在此查询中实现分页就像重新发明轮子一样,必须有开箱即用的解决方案。

我正在使用sqlx,这是我的代码的粗略示例:

query := `
        SELECT id, content, timestamp
        FROM msg.Messages
        WHERE id > $0
    `

args = 5
query = ado.db.Rebind(query)
rows, err := ado.db.Queryx(query, args...)
var res []Message

for rows.Next() {
    msg := Message{}
    err = rows.StructScan(&msg)
    if err != nil {
        return nil, err
    }
    res = append(res, msg)
}

return res, nil

如何将这段代码转换为延迟加载,即仅在rows.next()上才能获取下一个项目(而不是提前加载所有项目),那么垃圾收集器又如何呢? 它会在row.next()的每次迭代中释放内存吗?

0 个答案:

没有答案