使用gorm检索没有模型的记录

时间:2018-07-05 19:56:09

标签: postgresql go go-gorm

我有一个postgre数据库和一个小小的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 :(得分:2)

如本案例中的注释所述,无需使用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)
    }
}