摘要PSQL写查询

问题描述 投票:0回答:1

我有一个典型的函数,它接受来自前端的post请求,并将数据解码为struct,以便将它放入psql数据库。你可以看到下面的代码。我的问题是我希望能够抽象这个函数,这样我就可以给它任意类型的任何变量,这样对于每个请求我都不必有一个单独的写处理程序。

它看起来很难,因为我不得不以某种方式通过抽象var profitReq profitReq来为任何结构工作。如果golang有某种eval字符串方法,我会知道如何做到这一点,但如果我错了,有人会纠正我,但我不认为这样做。

我需要更改的另一个地方是QueryRow - 我必须能够在可变数量的变量中传递它。我可以很容易地构造字符串,但我不确定如何将变量追加到QueryRow。例如,如果我将所有变量附加​​到数组中,我无法将该数组传递给QueryRow,因为它不是如何构造的。再次,这里某种eval语句会有所帮助。

我是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"
}
postgresql go interface abstraction
1个回答
2
投票

您正在寻找的功能称为泛型。 Go 1.x不支持泛型 对我们来说幸运的是,有一个proposal for them for Go 2 (called Contracts)

在那之前你能做什么?

  1. 复制你的代码(可能是你现在正在做的)
  2. 使用接口 如果您知道此方法将始终通过电子邮件进行查询,则可以为此目的创建简单的界面:type Emailer interface { Email() string }
  3. 使用空接口(interface{})和反射来确定您拥有的列。
  4. 编写自己的发电机。有点像(1),但你不必自己这样做。

以下是它的要点:https://play.golang.org/p/A_2YKWLvmn-

© www.soinside.com 2019 - 2024. All rights reserved.