(id,name,creation_date,password,last seen)
в функцию мы передадим, что хотим увидеть поля (name,password,creation_date)
, а в качестве условий/фильтров поле name != 'user'
и last_seen > 15.07.2023
. И соотвественно чтобы функция выглядела примерно так NewSQL(fields,filters)
, которая возвращала бы уже sql запрос, т.е. билдер на основании этих двух параметров уже всё делает для произвольных полей.так как там три аргумента получаетсяВ filters я думал сделать в виде большой структуры/класса, в которой уже будет вся нужная инфа, т.е. например там хранится limit, offset, список нужных полей, и в ней же хранится ConditionFilter, в котором указаны поле, значение, тип операции и т.д.
Чисто функцию конкретно для задачи возможно будет сделать не сложно.Я сделал урезанный вариант для одной таблицы в целом это работает нормально, но перед тем как делать более полный и общий вариант, я хотел бы дизайн улучшить
Так же обычно делают плэйсхолдеры и сам запрос для подготовкиМожете пж конкретный пример привести? Я возможно не совсем понял, но например можно будет написать 1 такой запрос, которого хватит для того, чтобы получить фильтр, который сможет искать по 20+ параметрам, как например на озоне или в днс?
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"
, условно если в фильтр добавится несколько параметров, то мне придется переписывать код. Я же хочу, чтобы вся информация поступала уже в фильтре, т.е. передаю в функцию информацию о том, какие условия должны быть, какое значение должно быть больше/меньше, при этом если бы я добавил лишнее поле, то мне не пришлось бы переписывать код фильтра Squirrel makes conditional query building a breeze:Вот более наглядный пример, в их же примере пишут, как они предлагают решать ситуацию с доп. условиями, т.е. если хочешь добавить дополнительное поле, то пиши лишний if под него
if len(q) > 0 {
users = users.Where("name LIKE ?", fmt.Sprint("%", q, "%"))
}
просто надо написать тонкую обертку над сквирелом, которая подгонит логику под нужную вамЯ как раз и хочу написать либу, которая сможет избегать написания прослоек, и вместо прослоек данные будут браться из фильтров, которые передаёт пользователь
https://go.dev/play/p/sjTxk8Sz-w0Я примерно сейчас так и делаю, это достаточно удобный подход, но я хотел попробовать перейти к более общему подходу и не привязывать либу к конкретным билдерам
как по мне, функция Where(sq.And{}) у сквирела это и есть "фильтры, которые передает пользователь", так и не понял, чем отличается от этого то, что вы хотите.Думаю ваш вариант рабочий и в целом можно написать про то, что я говорил, думаю пару идей точно возьму из него. Если хотите могу как ответ отметить
идёте на гитхаб в поиск. Там любой язык по вкусуОчень, полезно спасибо