使用 gorm 在没有模型的情况下检索记录

Retrieving records without model using gorm

我有一个 postgre 数据库和一点 Go api。

以下函数的想法是检索 json 响应中的所有记录。我只知道table的名字,不知道table的字段名。

代码:

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

此函数将检索空值。

有没有办法在不通过模型的情况下检索记录?

如本案例的评论中所述,无需使用 gorm,您可以使用本机 sql 包检索数据。

After retrieving the data I strongly suggest making a struck for it and using it instead of empty interfaces.

您可以像这样从 products table 中检索数据:

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