抽象PSQL写查询

时间:2018-09-01 21:24:19

标签: postgresql go interface abstraction

我有一个典型的函数,该函数从前端接收发布请求,然后将数据解码为结构,以便将其放入psql数据库。您可以在下面看到代码。我的问题是我希望能够抽象化此函数,以便可以为它提供任意数量的任何类型的变量,这样对于每个请求,我都不必拥有单独的写处理程序。

这看起来很困难,因为我必须以某种方式传递一种抽象with newest_MEAS as ( select ROAD_ID, MEAS.m, max(year) y from road_events join (select rownum -1 m from dual connect by rownum -1 <= (select max(TOTAL_ROAD_LENGTH) from road_events) ) MEAS on MEAS.m between FROM_MEAS and TO_MEAS group by ROAD_ID, MEAS.m ) select re.event_id, nm.ROAD_ID, re.total_road_length, nm.y, count(nm.m) EVENT_LENGTH from newest_MEAS nm join road_events re on nm.ROAD_ID = re.ROAD_ID and nm.m between re.from_meas and re.to_meas -1 and nm.y = re.year group by re.event_id, nm.ROAD_ID, re.total_road_length, nm.y order by event_id 的方式以用于任何结构。如果golang具有某种eval字符串方法,我会知道该怎么做,但是如果我错了,有人可以纠正我,但我认为不会。

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

我对golang并不陌生,但是我已经看到很多与接口相关的很棒的东西,我承认我不太了解。在这里有一种使用界面的方法会有所帮助吗?

感谢任何可以提供帮助的人!

var profitReq profitReq

1 个答案:

答案 0 :(得分: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-