我正在使用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()的每次迭代中释放内存吗?