Как преобразовать результаты запроса sqlx в массив структур? - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь запросить все результаты из таблицы postgres без условия условия и сопоставить ее с массивом структур с помощью sqlx db Query, передавая интерфейс args ... {{.

НоКод, вставленный ниже, никогда не работает. Вместо того, чтобы повторять и сканировать результат один за другим, возможно ли получить следующий код? ??

Входные данные очень ценятся.Спасибо

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)
    }

Ожидаемые результаты:

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

Фактически: ничего ..

Ответы [ 2 ]

1 голос
/ 23 июня 2019
  1. Вам не нужно переименовывать поля в запросе, поскольку вы определяете фактические поля БД в тегах структуры.

  2. Если выВы хотите сканировать непосредственно на фрагмент CustomData, и если вы используете SQLX, вы должны использовать специфичный для SQLX метод Select, а не общий SQL-запрос.Слегка измененный соответствующий пример из иллюстрированного руководства по SQLX (https://jmoiron.github.io/sqlx/#getAndSelect):

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

Так в вашем случае:

    myData := []CustomData
    err = db.Select(&myData, "SELECT * FROM myschema.my_table")
1 голос
/ 23 июня 2019

вы можете использовать следующее:

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

и вы всегда можете использовать библиотеку ORM в качестве gorm , если вам нравится первый подход к коду, или sqlboiler , если вам нравится первый подход к БД

...