Mozhi
Mozhi

Reputation: 827

How to convert sqlx query results to an array of structs?

I am trying to query all the results from a postgres table without where condition and map it with array of structs with the help of sqlx db Query by passing the args ...interface {}.

But the code pasted below never works, Instead of iterating and scanning the result one by one , is it possible to get the following code work ??

Inputs are much appreciated . Thank you

type CustomData struct {
    ID                        string `db:"id" json:",omitempty"`
    Name                      string `db:"name" json:",omitempty"`
    Description               string `db:"description" json:",omitempty"`
    SourceID                  string `db:"sourceid" json:",omitempty"`
    StatusID                  string `db:"statusid" json:",omitempty"`
    StatusReason              string `db:"statusreason" json:",omitempty"`
    CreateTime                string `db:"createtime" json:",omitempty"`
    UpdateTime                string `db:"updatetime" json:",omitempty"`
}

var myData []CustomData

*sqlx.DB.Query("SELECT id as ID,  name as Name, description as Description, sourceid as SourceID, statusid as StatusID, statusreason as StatusReason, createtime as CreateTime, updatetime as UpdateTime FROM myschema.my_table", &myData)

// tried with following statement but din't work either
// *sqlx.DB.Query("SELECT * FROM myschema.my_table", &myData)

    for _, data := range myData {
        fmt.Println("--", data)
    }

Expected results:

--- CustomData{1,x,x,x,x} --- CustomData{2,x,x,x,x}

Actual: Nothing..

Upvotes: 4

Views: 9274

Answers (2)

Filip Wojciechowski
Filip Wojciechowski

Reputation: 349

  1. You don't need to rename the fields in the query, since you're defining the actual DB fields in the struct tags.

  2. If you want to scan directly to the slice of CustomData and if you are using SQLX, you should use the SQLX specific Select method, rather than the generic SQL Query. Slightly modified relevant example from the illustrated guide to SQLX (https://jmoiron.github.io/sqlx/#getAndSelect):

    pp := []Place{}
    err = db.Select(&pp, "SELECT * FROM place")

So in your case:

    myData := []CustomData
    err = db.Select(&myData, "SELECT * FROM myschema.my_table")

Upvotes: 8

Or Yaacov
Or Yaacov

Reputation: 3880

you can use the following:

for rows.Next() {
    s := CustomData{}
    if err := rows.Scan(&s); err != nil {
        return err
    }
    fmt.Println(s)
}

and you can always use ORM library as gorm if you like code first approach or sqlboiler if you like DB first approach

Upvotes: 1

Related Questions