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 AI
Отговор от AI
В този метод на Go се изпълнява заявка към базата данни за получаване на идентификаторите на активните поръчки с пагинация (offset и limit).
Кодът правилно използва подготвен заявка с параметри, което предотвратява SQL инжекции.
Въпреки това, има няколко препоръки за подобрение:
- Препоръчително е да затваряте
rowsслед използване, за да избегнете изтичане на ресурси:
rows, err := r.slave.Query(ctx, query, args...)
if err != nil {
return nil, err
}
defer rows.Close()
-
Може да се използва
rows.Err()след цикъла за проверка за грешки при итерация. -
Параметрите LIMIT и OFFSET обикновено са в този ред, но в заявката са като LIMIT $1 OFFSET $2, което е правилно, ако limit и offset се предават в този ред.
-
Ако се очаква голям обем данни, трябва да се обмисли използването на курсори или потокова обработка.
Пример с затваряне на rows и проверка за грешки:
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