Middle+
func (r *OrderRepository) GetActiveOrderIDs(ctx context.Context, offset, limit int) ([]uint32, error) { var ( res []uint32 args []interface{} ) query := `SELECT id FROM "order" WHERE is_terminated = false LIMIT $1 OFFSET $2;` args = append(args, limit, offset) rows, err := r.slave.Query(ctx, query, args...) if err != nil { return nil, err } for rows.Next() { var orderID uint32 if err = rows.Scan(&orderID); err != nil { return nil, err } res = append(res, orderID) } return res, nil }
sobes.tech IA
Resposta da IA
Neste método em Go, é feita uma consulta à base de dados para obter os identificadores de pedidos ativos com paginação (offset e limit).
O código utiliza corretamente uma consulta preparada com parâmetros, o que previne injeções SQL.
No entanto, há algumas recomendações para melhorar:
- É aconselhável fechar
rowsapós o uso para evitar fugas de recursos:
rows, err := r.slave.Query(ctx, query, args...)
if err != nil {
return nil, err
}
defer rows.Close()
-
Pode-se usar
rows.Err()após o ciclo para verificar erros de iteração. -
Os parâmetros LIMIT e OFFSET geralmente vêm nesta ordem, mas na consulta estão como LIMIT $1 OFFSET $2, o que é correto se passar limit e offset nesta ordem.
-
Se se espera uma grande quantidade de dados, deve-se considerar o uso de cursores ou processamento em streaming.
Exemplo com fechamento de rows e verificação de erros:
rows, err := r.slave.Query(ctx, query, args...)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var orderID uint32
if err = rows.Scan(&orderID); err != nil {
return nil, err
}
res = append(res, orderID)
}
if err = rows.Err(); err != nil {
return nil, err
}
return res, nil