Построить динамический (условный) запрос SQL WHERE в Голанге - PullRequest
0 голосов
/ 14 сентября 2018

Я использую golang, go_reform, PostgreSQL.То, что я хочу сделать, - это поисковая утилита REST, и все прошло нормально, пока я не столкнулся с условным поисковым запросом.«Условный» здесь означает, что у меня есть 10 столбцов в таблице для поиска, и может быть множество комбинаций, поэтому я не могу обработать их все по отдельности.Что мне нужно, это построитель запросов, но я не понимаю, как я могу реализовать это в Go.Пока что у меня есть идея, подобная этой, но она кажется не очень эффективной

type Query struct {
    Id               *int64
    FirstName        *string
    MiddleName       *string
    LastName         *string
    AreaId           *int64
    Birthday         *time.Time
}

func (table *Query) Find() (*User) {
    if table.Id != nil {
        idstr := fmt.Sprintf("WHERE Id = %d AND ", table.Id)
    }
    else idstr := "WHERE "
    }
    if table.FirstName != "" {
        firststr := fmt.Sprintf("FirstName = %s AND", table.FirstName)
    }
    else firststr := ""
}//and so on

Это кажется очень неловким, поэтому мне интересно, есть ли лучший способ определить поля, которые пришли к Find() ипостроить запрос SQL на основе этого.(На самом деле он идет в JSON и привязывается к Query struct, так что, возможно, есть выход без struct).Также могут быть обходные пути SQL, но я думаю, что было бы более эффективно создать запрос без всех возможных столбцов.

РЕДАКТИРОВАТЬ: Кстати, делая мой поисковый запрос Google более точным, янашел кучу вещей, связанных с моей проблемой, вероятно, я попытаюсь использовать это сейчас.Для тех, кто также заинтересован: старый пример go go playstation

Выполнение динамических запросов SQL к базе данных MySQL

пакет gorp (фрагмент кода звучит очень многообещающе)

Ответы [ 3 ]

0 голосов
/ 31 января 2019

в PostgreSQL

Запрос (строка sql, args ...)

Здесь, когда я передаю значения в Query в форме Запрос (строка, значение) Выдает ошибку, что добавлено только одно значение, ожидаемое должно быть 2. Как передать массив интерфейса в качестве аргументов в Query

Я нашел ответ: вам нужно передать его как Query (строка, значения ...)

0 голосов
/ 31 января 2019

В orm GORM мы делаем это как

if con1 {
    db.Where("con1 =?", con1Flag)
}

Если orm, который вы пишете yoursefl, я предлагаю изменить на gorm. Или вы можете ссылаться на используемый вами orm, независимо от того, имеет ли он тот же самый тип использования, что и приведенный выше код. Если вы кодируете себя, делайте это как хотите. Если вы работаете в группе, я думаю, лучше использовать зрелую орму

0 голосов
/ 14 сентября 2018

Итак, я нашел решение.Большое спасибо этому парню , его код идеально подходит для меня, мне нравится, как он работает.Позор тем парням, которые думают, что если-либо еще - единственный способ сделать это возможным.Мой точный код таков: Контроллер

func Find(c echo.Context) (err error) {
model := &models.Query{}
if err = c.Bind(model); err != nil {
    return c.JSON(http.StatusInternalServerError, u.Message(false, "Bad request"))
}
resp := model

.Find () return c.JSON (http.StatusOK, соответственно) Функция модели:

type Query map[string]interface{}

func (model Query) Find() (Query) {
    var values []interface{}
    var where []string
    for k, v := range model {
        values = append(values, v)
        //MySQL Way: where = append(where, fmt.Sprintf("%s = ?", k))
        where = append(where, fmt.Sprintf(`"%s" = %s`,k, "$" + strconv.Itoa(len(values))))
    }
    string := ("SELECT name FROM users WHERE " + strings.Join(where, " AND "))
    //for testing purposes i didn't ran actual query, just print it in the console and returned JSON back
    fmt.Println(string)
    return model

}

UPD: для пользователей PostgreSQL, таких как я(благодаря @mkopriva и его примеру детской площадки ), я могу заставить эту штуку-заполнитель работать прямо на PostgreSQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...