【问题标题】:Jmoiron SQLX Golang common interfaceJmoiron SQLX Golang 通用接口
【发布时间】:2016-08-17 10:43:40
【问题描述】:

我是 golang 新手,使用 Jmoiron Sqlx 包查询 Postgres 数据库(选择查询)。我正在做的方式是创建一个 sql 字符串并调用 Select(dest interface{}, query string,args) 方法。虽然效果很好,但问题是我正在动态生成我的 sql 字符串,因此每个响应的目标结构应该不同。

例如:- 一个查询可以是

Select a,b,c,d from table A ;

另一个可以是

Select x,y,z from Table B;

据我了解,应该为 Select Method 定义两个不同的结构,即

Struct Resp1{
   a string
   b string
   c  string
   d string
}

还有,

Struct Resp2{
   x string
   y string
   z  string

}

然后调用 select as db.Select(&resp1,query,args)db.Select(&resp2,query,args) 我在想我是否可以定义一个通用的 Struct

say Resp3{
   a string
   b string
   c  string
   d string
   x string
   y string
   z  string
}

并且根据我的选择查询仅填充匹配的列(即第一列仅 a、b、c、d 和第二个 x、y、z)。

我尝试搜索,但找不到任何线索。

【问题讨论】:

    标签: go sqlx


    【解决方案1】:

    我无法在这里得到答案,因为我需要这个,所以我自己挖掘并找到了如何以有效的方式解决这个问题。

    要解决这个问题,可以将所有字符串值定义为 sql.NullString ,整数为 sql.int64 ,浮点为 sql.float64 等。

    所以假设您的表格有列 a,b,c,d,e,f 并且对于某些响应,您只需为其他一些 d,e 显示 a,b,d 等等。而不是创建不同的结构并在 db.Select(...) 语句中映射它们只需定义你的结构如下

    a       sql.NullString `json:"whatever u wish to have as key,omitempty"`
    b       sql.NullString `json:"b,omitempty"`
    c       sql.NullString `json:"c,omitempty"`
    d       sql.int64  `json:"d,omitempty"`
    e       sql.float64  `json:"e,omitempty"`
    

    记住 sql.NullString 将被编组为 json 并显示一个附加键 (Valid:boolean) 。你可以按照这里的方法来解决这个问题How can I work with sql NULL values and JSON in Golang in a good way?

    希望这对某人有帮助。!!

    【讨论】:

      【解决方案2】:

      通常,您的结构应该代表 SQL 表的所有字段,而不仅仅是您在 SELECT 中获取的字段,因此您只需执行 SELECT * FROM... 并将 db 的响应反序列化到您的结构 Resp3

      【讨论】:

      • 选择 * 是一种危险的策略(如果您添加或删除列)。 goLang 可能没问题,但应该避免在 ORM 世界中泛型使用(选择 *)。
      猜你喜欢
      • 2016-06-09
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 2016-10-15
      • 1970-01-01
      • 2017-09-10
      相关资源
      最近更新 更多