Как запросить несколько строк и разбор JSON? - PullRequest
0 голосов
/ 04 января 2019

У меня есть этот код:

func GetAll(c *gin.Context) {

var veiculos model.Veiculo

rows, err := db.Query("SELECT * FROM vei_veiculo")
if err != nil {
    fmt.Println("[GetAll] erro ao abrir o query db inteiro")
}
defer rows.Close()
for rows.Next() {
    err := rows.Scan(&veiculos)
    if err != nil {
        fmt.Println("[GetAll] erro ao scanear uma linha'")
    }
}
fmt.Println(veiculos)}

Мое имя структуры в model.Veiculo, и я хочу напечатать все это один раз. Кажется, есть ошибка при сканировании строк запроса. Что я сделал не так?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Чтобы отсканировать каждую строку в ее собственную структуру, я рекомендую такой подход:

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql"
)

type Person struct {
    FirstName string
    LastName  string
    Email     string
}

func main() {
    db, err := sql.Open("mysql", "dsn...")
    if err != nil {
        log.Fatalln(err)
    }
    defer db.Close()

    people := []Person{}

    rows, err := db.Query("SELECT * FROM people")
    if err != nil {
        log.Fatalln(err)
    }

    for rows.Next() {
        person := Person{}
        if err := rows.Scan(&person.FirstName, &person.LastName, &person.Email); err != nil {
            log.Fatalln(err)
        }
        people = append(people, person)
    }

    fmt.Printf("%+v\n", people)
}

В качестве альтернативы библиотека https://github.com/jmoiron/sqlx существует в качестве одного из решений для маршалинга данных SQL-запроса в структуры. Я лично предпочитаю этот метод, так как он ведет себя больше как функция Unmarshal:

package main

import (
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
)

type Person struct {
    FirstName string `db:"first_name"`
    LastName  string `db:"last_name"`
    Email     string `db:"email"`
}

func main() {
    db, err := sqlx.Connect("mysql", "dsn...")
    if err != nil {
        log.Fatalln(err)
    }

    people := []Person{}

    if err := db.Select(&people, "SELECT * FROM people"); err != nil {
        log.Fataln(err)
    }

    fmt.Printf("%+v\n", people)
}

Использование любого из этих подходов позволяет легко использовать json.Marshal метод с переменной people и альтом!

Удачи!

0 голосов
/ 04 января 2019

Если вы используете database/sql, сигнатура функции - func (rs *Rows) Scan(dest ...interface{}) error.

Вам нужно сканировать каждый член структуры, что-то вроде:

err := rows.Scan(&veiculos.ID, &veiculos.Name, &veiculos.Description)
...