Size: a a a

2020 July 02

ВГ

Владимир Гришин... in Go-go!
Никита
Кто как делает сложные запросы к базе с кучей условий? Думал взять любой query builder для этого, но не понимаю, как хорошо это абстрагировать, и чтобы поля, которые фигурируют в запросе, не торчали своем SQL-виде типа CONCAT(first_name, ‘ ‘, last_name), а были скрыты
gorm
источник

ЛА

Локоть Анатолий... in Go-go!
Никита
Кто как делает сложные запросы к базе с кучей условий? Думал взять любой query builder для этого, но не понимаю, как хорошо это абстрагировать, и чтобы поля, которые фигурируют в запросе, не торчали своем SQL-виде типа CONCAT(first_name, ‘ ‘, last_name), а были скрыты
Я делаю сущность "фильтр",типа
UserFilter struct {
Name string
}

Дальше метод репозитория принимает этот фильтр и в зависимости от заполненных полей собирает запрос. Тут что с орм, что без него - одинаково - конструируем sql, ничего не абстрагируем.

С gorm это как-то так:
If filter.Name != "" {
   bulider = builder.Where("name = ?", filter.Name)
}

builder.Count...
builder.Find...


Без gorm суть остаётся той же,
Но там разница в том, что все значения плейсхолдеров собираем в слайс []interface, и передаём при запросе единожды при запросе.
источник

М

Марк in Go-go!
а это кто
Лучше сначала назвать структуру которую вы храните в массиве

package main

type Contact struct {
 Name   string
json:"name"
 Agency string
json:"agency"
 Phones []int  
json:"phones"
}

func main() {
 var contacts []Contact

 contacts = make([]Contact, 10)

 _ = contacts
}
Да, мне для обучения и понимания, спасибо
источник

DS

Dmitry Soloma in Go-go!
Никита
Так при чем тут орм. Мне нужно строить сложный запрос. мне и легковесный squirrel может подошел бы, но я как минимум не хочу чтобы он светился в бизнес логике, и его надо за чем-то скрыть, каким то уровнем абстракции, чтобы, опять же, не было много SQL специфики в бизнесе
Ну сейчас вроде модно Репозиторий, следовательно весь sql можно затащить туда, а бизенс логика использует уже законченные методы
Если же у вас AR тогда вообще не паримся и весь sql записываем там, опять же бизнес логика использует готовую реализацию. Вариантов много отделения Бизнеса от SQL
источник

М

Марк in Go-go!
Dmitry Soloma
type Contact struct {
Name   string `json:"name"`
Agency string `json:"agency"`
Phones []int  `json:"phones"`
}

var contacts = []Contact{
{Name: "Foo", Agency: "Bar", Phones: []int{192}},
{Name: "Moo", Agency: "Baz", Phones: []int{256}},
}
Слишком просто =)  так у меня уже было сделано, но где-то в мануале видел именно свой вариант, но не помнил что дальше
источник

Н

Никита in Go-go!
Локоть Анатолий
Я делаю сущность "фильтр",типа
UserFilter struct {
Name string
}

Дальше метод репозитория принимает этот фильтр и в зависимости от заполненных полей собирает запрос. Тут что с орм, что без него - одинаково - конструируем sql, ничего не абстрагируем.

С gorm это как-то так:
If filter.Name != "" {
   bulider = builder.Where("name = ?", filter.Name)
}

builder.Count...
builder.Find...


Без gorm суть остаётся той же,
Но там разница в том, что все значения плейсхолдеров собираем в слайс []interface, и передаём при запросе единожды при запросе.
Вот я думал делать так, но как быть с местами, где у нас вложенные and/or и какие-то части запроса определяются вышестоящими условиями
источник

ЛА

Локоть Анатолий... in Go-go!
Никита
Вот я думал делать так, но как быть с местами, где у нас вложенные and/or и какие-то части запроса определяются вышестоящими условиями
В моем примере как раз заполненные поля фильтра добавляют ветки AND. Те передали имя - филтруем по имени, передали id - and фильтруем по id.

А приведите пример OR?
источник

ЛА

Локоть Анатолий... in Go-go!
Локоть Анатолий
В моем примере как раз заполненные поля фильтра добавляют ветки AND. Те передали имя - филтруем по имени, передали id - and фильтруем по id.

А приведите пример OR?
Если на голом sql собираем запрос, то удобно сделать Where true, а дальше всегда до добавлять AND, не думая первое это условие или второе, или ещё какое
источник

Н

Никита in Go-go!
Локоть Анатолий
В моем примере как раз заполненные поля фильтра добавляют ветки AND. Те передали имя - филтруем по имени, передали id - and фильтруем по id.

А приведите пример OR?
Пример с проекта на питоне https://pastebin.com/eK0NnA7U

Я думал вот такой подход и перетянуть, но мне не нравится, что SQL поля тут явно прописываются, типа "group_relations.type"
источник

ВГ

Владимир Гришин... in Go-go!
Никита
Пример с проекта на питоне https://pastebin.com/eK0NnA7U

Я думал вот такой подход и перетянуть, но мне не нравится, что SQL поля тут явно прописываются, типа "group_relations.type"
возьмите билдер из горма. можно делать запросы полями в структуре
источник

ВГ

Владимир Гришин... in Go-go!
чем он вам не подходит?
источник

ЛА

Локоть Анатолий... in Go-go!
Никита
Пример с проекта на питоне https://pastebin.com/eK0NnA7U

Я думал вот такой подход и перетянуть, но мне не нравится, что SQL поля тут явно прописываются, типа "group_relations.type"
Как я понял тут or это часть одной логической ветки, фильтрация по группе значений, это удобно так:

if len(filter.Names) > 0 {
   builder = builder.Where("name = ANY(?)", pq.Array(filter.Names))
}

Гормовское where работает как and, если несколько раз вызывается, пусть вас его имя тут не смущает
источник

Н

Никита in Go-go!
Никита
Пример с проекта на питоне https://pastebin.com/eK0NnA7U

Я думал вот такой подход и перетянуть, но мне не нравится, что SQL поля тут явно прописываются, типа "group_relations.type"
Та же проблема

db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)


тут явно торчит SQL, нужен какой-то обобщенный подход, как тут, но и чтобы поля тоже скрыть можно было
источник

ЛА

Локоть Анатолий... in Go-go!
Никита
Та же проблема

db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)


тут явно торчит SQL, нужен какой-то обобщенный подход, как тут, но и чтобы поля тоже скрыть можно было
Я бы не уходил от sql, это путь вникуда и главное зачем?
Тут у вас как раз фильтр по 2 полям
источник

ВГ

Владимир Гришин... in Go-go!
db.Where(User{Name: "Jinzhu”}).Where(“age > ?”, 22)
источник

Н

Никита in Go-go!
Локоть Анатолий
Как я понял тут or это часть одной логической ветки, фильтрация по группе значений, это удобно так:

if len(filter.Names) > 0 {
   builder = builder.Where("name = ANY(?)", pq.Array(filter.Names))
}

Гормовское where работает как and, если несколько раз вызывается, пусть вас его имя тут не смущает
Если с тем or можно разобраться так, то вот как такую логику уместить

if params.managed:
набор условия
else:
        другой набор условий
источник

ЛА

Локоть Анатолий... in Go-go!
Владимир Гришин
db.Where(User{Name: "Jinzhu”}).Where(“age > ?”, 22)
То же , что я предложил выше, только без поправки на опциональность каждого из полей фильтра
источник

ВГ

Владимир Гришин... in Go-go!
вообще я плюсану, что не надо уходить от sql, а то вместо sql придется учить DSL билдера
источник

D

Dmitry in Go-go!
Всем привет. Я в Go полный 0, Front-End, кто подскажет, где я могу прочесть о наиболее подходящих областях применения языка?
источник

ВГ

Владимир Гришин... in Go-go!
Локоть Анатолий
То же , что я предложил выше, только без поправки на опциональность каждого из полей фильтра
и параметр - структурой
источник