https://www.youtube.com/watch?v=1tNfKI03qRUтут подробнее.
но на сколько я понял про эффективную параллельную передачу данных там речи не шлоНе уверен, что правильно понимаю эту фразу, но засунуть в сообщение для 3кк соединений это не долго, каналы сами по себе достаточно эффективно работают параллельно (точнее конкурентно, но в данном случае не думаю что это настолько принципиально), в статье пункт 3.3.1 Goroutine pool есть ненмного текста про воркер пул, который будет обрабатывать это достаточно эффективно.
я хочу остановить его в этом случаи и запустить так же только после включения базы данных.Если это так нужно, то проще на беке прописать такой функционал, но честно говоря в этом нет особого смысла.
Так если бекенд зависит от базы данных напрямую, без нее просто нет смысла в этом сервере,А в чем смысл его останавливать? Ну крутится он и крутится, какие-то операции возможны без БД, ресурсы сервера тоже особо экономить нет смысла (обычно по крайней мере). Я не знаю вашей ситуации, но без контекста выглядит всё просто как ненужный костыль. Тем более в автоматическом режиме редко занимаются, того что сервис вернет 500 код будет более чем достаточно, если он не может подключиться к БД, гасить его нет смысла
идёте на гитхаб в поиск. Там любой язык по вкусуОчень, полезно спасибо
как по мне, функция Where(sq.And{}) у сквирела это и есть "фильтры, которые передает пользователь", так и не понял, чем отличается от этого то, что вы хотите.Думаю ваш вариант рабочий и в целом можно написать про то, что я говорил, думаю пару идей точно возьму из него. Если хотите могу как ответ отметить
https://go.dev/play/p/sjTxk8Sz-w0Я примерно сейчас так и делаю, это достаточно удобный подход, но я хотел попробовать перейти к более общему подходу и не привязывать либу к конкретным билдерам
просто надо написать тонкую обертку над сквирелом, которая подгонит логику под нужную вамЯ как раз и хочу написать либу, которая сможет избегать написания прослоек, и вместо прослоек данные будут браться из фильтров, которые передаёт пользователь
Squirrel makes conditional query building a breeze:Вот более наглядный пример, в их же примере пишут, как они предлагают решать ситуацию с доп. условиями, т.е. если хочешь добавить дополнительное поле, то пиши лишний if под него
if len(q) > 0 {
users = users.Where("name LIKE ?", fmt.Sprint("%", q, "%"))
}
import sq "github.com/Masterminds/squirrel"
users := sq.Select("*").From("users").Join("emails USING (email_id)")
active := users.Where(sq.Eq{"deleted_at": nil})
sql, args, err := active.ToSql()
sql == "SELECT * FROM users JOIN emails USING (email_id) WHERE deleted_at IS NULL"
, условно если в фильтр добавится несколько параметров, то мне придется переписывать код. Я же хочу, чтобы вся информация поступала уже в фильтре, т.е. передаю в функцию информацию о том, какие условия должны быть, какое значение должно быть больше/меньше, при этом если бы я добавил лишнее поле, то мне не пришлось бы переписывать код фильтра так как там три аргумента получаетсяВ filters я думал сделать в виде большой структуры/класса, в которой уже будет вся нужная инфа, т.е. например там хранится limit, offset, список нужных полей, и в ней же хранится ConditionFilter, в котором указаны поле, значение, тип операции и т.д.
Чисто функцию конкретно для задачи возможно будет сделать не сложно.Я сделал урезанный вариант для одной таблицы в целом это работает нормально, но перед тем как делать более полный и общий вариант, я хотел бы дизайн улучшить
Так же обычно делают плэйсхолдеры и сам запрос для подготовкиМожете пж конкретный пример привести? Я возможно не совсем понял, но например можно будет написать 1 такой запрос, которого хватит для того, чтобы получить фильтр, который сможет искать по 20+ параметрам, как например на озоне или в днс?