Получение записей без модели с помощью gorm - PullRequest
0 голосов
/ 05 июля 2018

У меня есть postgre DB и немного Go api.

Идея следующей функции - извлечь все записи в ответе json. Я просто знаю имя таблицы, я не знаю имен полей таблицы.

Код:

func indexProductHandler(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    setCors(w)
    //var products []database.Products
    var results []map[string]interface{}

    database.DB.Raw("SELECT * from products").Scan(&results)
    res, err := json.Marshal(results)

    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }
    w.Write(res)
}

Эта функция будет получать нулевые значения.

Есть ли способ получить записи, не передавая модель?

1 Ответ

0 голосов
/ 06 июля 2018

Как уже упоминалось в комментариях для этого случая, нет необходимости использовать gorm, вы можете получить данные с помощью собственного пакета sql.

После извлечения данных я настоятельно рекомендую нанести удар и использовать его вместо пустых интерфейсов.

Вы можете получить данные из таблицы products следующим образом:

package main

import (
    "fmt"
    "log"
    "database/sql"
    _ "github.com/lib/pq"
    "encoding/json"
)

func main() {
    db, err := sql.Open("postgres", "user=USR password=PWD dbname=DBN sslmode=disable")
    checkErr(err)

    rows, err := db.Query("SELECT * FROM products")
    checkErr(err)

    // Get the column names from the query
    var columns []string
    columns, err = rows.Columns()
    checkErr(err)

    colNum := len(columns)

    var results []map[string]interface{}

    for rows.Next() {
        // Prepare to read row using Scan
        r := make([]interface{}, colNum)
        for i := range r {
            r[i] = &r[i]
        }

        // Read rows using Scan
        err = rows.Scan(r...)
        checkErr(err)

        // Create a row map to store row's data
        var row = map[string]interface{}{}
        for i := range r {
            row[columns[i]] = r[i]
        }

        // Append to the final results slice
        results = append(results, row)
    }

    fmt.Println(results) // You can then json.Marshal or w/e

    // If you want it pretty-printed
    r, err := json.MarshalIndent(results, "", "  ")
    checkErr(err)
    fmt.Println(string(r))       
}

func checkErr(err error) {
    if err != nil {
        log.Fatal(err)
    }
}
...