我有一个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)
}
此函数将检索空值。
是否可以在不通过模型的情况下检索记录?
答案 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)
}
}