抽象 PSQL 写查询
Abstracting PSQL Write Query
我有一个典型的函数,它接受来自前端的 post 请求并将数据解码为结构,以便将其放入 psql 数据库中。你可以看到下面的代码。我的问题是我希望能够抽象这个函数,这样我就可以给它任何数量的任何类型的变量,这样对于每个请求我都不必有一个单独的写处理程序。
这看起来很难,因为我必须以某种方式传递抽象 var profitReq profitReq
以适用于任何结构。如果 golang 有某种 eval string 方法,我会知道该怎么做,但如果我错了,有人会纠正我,但我认为它不会。
我需要更改的另一个地方是 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(, , , , , , , , , ) 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"
}
您正在寻找的功能称为泛型。
Go 不支持泛型 1.x
对我们来说幸运的是,有一个 proposal for them for Go 2 (called Contracts)
在那之前你能做什么?
- 复制您的代码(可能是您现在正在做的)
使用接口
如果您知道此方法将始终通过电子邮件查询,您可以为此目的创建简单的界面:type Emailer interface { Email() string }
使用空接口 (interface{}
) 和反射来确定您有哪些列。
编写自己的生成器。有点像(1),但你不必自己做。
我有一个典型的函数,它接受来自前端的 post 请求并将数据解码为结构,以便将其放入 psql 数据库中。你可以看到下面的代码。我的问题是我希望能够抽象这个函数,这样我就可以给它任何数量的任何类型的变量,这样对于每个请求我都不必有一个单独的写处理程序。
这看起来很难,因为我必须以某种方式传递抽象 var profitReq profitReq
以适用于任何结构。如果 golang 有某种 eval string 方法,我会知道该怎么做,但如果我错了,有人会纠正我,但我认为它不会。
我需要更改的另一个地方是 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(, , , , , , , , , ) 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"
}
您正在寻找的功能称为泛型。
Go 不支持泛型 1.x
对我们来说幸运的是,有一个 proposal for them for Go 2 (called Contracts)
在那之前你能做什么?
- 复制您的代码(可能是您现在正在做的)
使用接口
如果您知道此方法将始终通过电子邮件查询,您可以为此目的创建简单的界面:type Emailer interface { Email() string }
使用空接口 (
interface{}
) 和反射来确定您有哪些列。编写自己的生成器。有点像(1),但你不必自己做。