I am new to golang and using Jmoiron Sqlx package for querying the Postgres Database(select query) . The waY I am doing is creating a sql string and calling Select(dest interface{}, query string,args) method. While it works well , the problem is I am generating my sql String dynamically and as such the destination structure should be different for each response .
For ex : - One query can be
Select a,b,c,d from table A ;
the other can be
Select x,y,z from Table B;
From what i understand , there should be two different structs defined for Select Method to work i.e.
Struct Resp1{
a string
b string
c string
d string
}
And,
Struct Resp2{
x string
y string
z string
}
And then invoke select as db.Select(&resp1,query,args)
and db.Select(&resp2,query,args)
I am thinking if its possible for me to define a common Struct
say Resp3{
a string
b string
c string
d string
x string
y string
z string
}
And based on my select query populates only the matching columns (i.e only a,b,c,d for first and x,y,z for second) .
I tried searching but couldnt get any leads .
I could not get answer to this here and since I needed this , I dug up myself and I found how to solve this in an efficient way .
To solve this one can define all your String values as sql.NullString , integer as sql.int64 , float as sql.float64 etc .
So Say your table is having columns a,b,c,d,e,f and for some response you only have to display a,b,d for some other d,e and so on . Instead of creating different structures and mapping them in db.Select(...) statement Just define ur struct as follows
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"`
Remember sql.NullString will be Marshalled to json with an additional key displayed (Valid:boolean) . You can follow approach here to fix that How can I work with sql NULL values and JSON in Golang in a good way?
Hope this is helpful to someone.!!
Usually your struct should represent all fields of SQL table, not only fields that you are fetching in SELECT
, so you can just do SELECT * FROM...
and deserialize response from db to your struct Resp3
.