Абстрагирование PSQL Write Query - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть типичная функция, которая принимает запрос post от внешнего интерфейса и декодирует данные в структуру, чтобы поместить их в базу данных psql. Вы можете увидеть код ниже. Моя проблема в том, что я хочу иметь возможность абстрагировать эту функцию, чтобы я мог дать ей любое количество переменных любого типа, чтобы для каждого запроса не требовался отдельный обработчик записи.

Это выглядит сложно, потому что мне нужно было бы каким-то образом перейти к абстракции var profitReq profitReq для работы с любой структурой. Если бы у Голанга был какой-то метод eval string, я бы знал, как это сделать, но кто-то исправит меня, если я ошибаюсь, но я не думаю, что это так.

Другое место, которое мне нужно изменить, находится в QueryRow - я должен быть в состоянии передать его в переменное число переменных. Я мог бы создать строку достаточно легко, но я не уверен, как обязательно добавлять переменные в этот QueryRow. Например, если я добавлю все переменные в массив, я не смогу передать этот массив в QueryRow, так как он не структурирован. Опять же, здесь может помочь какое-то утверждение.

Я новичок в golang, но я видел много интересных вещей, связанных с интерфейсами, которые я, правда, не очень хорошо понимаю. Был бы способ использовать интерфейс, который бы помог?

Спасибо всем, кто может помочь!

func Write_profit_table(profitWriteChannel chan string, profitType string, req *http.Request) {
    var profitReq profitReq;
    err := json.NewDecoder(req.Body).Decode(&profitReq);
    if err!=nil{
        log.Panic(err)
    }

    NotInDB, _ := Search_userinfo_table(profitReq.Email)

    if NotInDB == false {
        var lastInsertId int
        err2 := db.QueryRow("INSERT INTO profit(email, type, dateArray, amount, interest, compounded, recurring, name, description, profitFrom) 
                VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) returning uid;", 
                profitReq.Email, profitReq.Type, pq.Array(profitReq.DateArray), profitReq.Profit, profitReq.Interest, 
                profitReq.Compounded, profitReq.Recurring, profitReq.Name, profitReq.Description, profitReq.ProfitFrom).Scan(&lastInsertId);
        if err2!=nil{
            log.Panic(err2)
        }
    }

    profitWriteChannel<-"finished writing to profit"
}

1 Ответ

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

Функция, которую вы ищете, называется дженерики.
Обобщения не поддерживаются Go 1.x
К счастью для нас, есть предложение для них на Go 2 (называемое Контрактами)

Что вы можете сделать до тех пор?

  1. Дублируйте ваш код (вероятно, что вы делаете сейчас)
  2. Использовать интерфейсы
    Если вы знаете, что этот метод будет всегда запрашивать по электронной почте, вы можете создать простой интерфейс для этой цели: type Emailer interface { Email() string }

  3. Используйте пустой интерфейс (interface{}) и рефлексию, чтобы выяснить, какие у вас есть столбцы.

  4. Напишите свой собственный генератор. Немного похоже на (1), но вам не нужно делать это самостоятельно.

Вот суть этого: https://play.golang.org/p/A_2YKWLvmn-

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