使用 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)
}
}
我有一个 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)
}
}