есть такой код (где я захотел облегчить себе жизнь, чтобы не писать лишнего кода):
func Query(query string, params ...interface{}) func(...interface{}) {
conn := GetConnection()
defer ReleaseConnection(conn)
rows, err := conn.Query(query, params...)
if err != nil {
panic(err)
}
return func(results ...interface{}) {
defer rows.Close()
for rows.Next() {
err := rows.Scan(results...)
if err != nil {
panic(err)
}
}
}
}
Тут происходит следующее:
1) Берётся из connection pool’а conn + освобождает его в конце функции
2) Делает запрос в базу данных
3) Возвращает функцию, которая считывает данные, которые в нее передают
Использую так:
getResult := helpers.Query(`
SELECT username
FROM users
WHERE id=$1
LIMIT 1
`, userID)
var username pgtype.Varchar
getResult(&username)
return username.String
Но проблемы начинаются, когда захотел считать несколько рядов (что очевидно). Хотел сейчас сделать так, чтобы он возвращал канал, по которому уже возвращал результат, но тогда вопрос как сделать так, чтобы канал был на подобии “variadic”. Можете подсказать, кто с похожим сталкивался?
А зачем так?
Во-первых, конекшен не надо ручками брать и возвращать в пул, sql.DB сам это делает, во-вторых, нужен просто маппинг результата запроса в структуру, для этого можно sqlx заюзать
Обсуждают сегодня