xorm example not working: "runtime error: invalid memory address or nil pointer dereference"
xorm example not working: "runtime error: invalid memory address or nil pointer dereference"
基于 this 示例,我尝试编写一个程序来 return 来自数据库的一些数据。不幸的是,根据运行时控制台输出,(或多或少)相同的程序结构会在此处导致内存错误 err := orm.Find(&sensorDataEntry)
。
我在这里错过了什么?示例和我的程序都有使用 make() 创建的切片,并在 Find() 方法中使用引用。
有问题的代码:
package main
import (
"fmt"
"net/http"
"time"
"github.com/gorilla/mux"
_ "github.com/lib/pq"
//"database/sql"
"github.com/go-xorm/xorm"
)
var orm *xorm.Engine
func newRouter() *mux.Router {
r := mux.NewRouter()
r.HandleFunc("/sensorentries", GetSensorEntriesHandler).Methods("GET")
return r
}
type SensorDataEntry struct {
id int `xorm:"int"`
sensor_id string `xorm:"varchar(32)"`
key string `xorm:"varchar(128)"`
value float64 `xorm:"numeric(20,2)"`
created_at time.Time `xorm:"timestamp"`
}
func main() {
connString := "host=server.lan user=x password=x dbname=testdb sslmode=disable"
orm, err := xorm.NewEngine("postgres", connString)
//orm.ShowSQL(true)
if err != nil {
println(err)
return
}
if err = orm.Sync2(SensorDataEntry{}); err != nil {
return
}
r := newRouter()
http.ListenAndServe(":8080", r)
}
func GetSensorEntriesHandler(resp http.ResponseWriter, req *http.Request) {
sensorDataEntry := make([]SensorDataEntry, 0)
err := orm.Find(&sensorDataEntry)
if err != nil {
println(err)
}
fmt.Println(sensorDataEntry)
fmt.Fprintf(resp, "return text")
}
如 mkopriva 所述,问题是使用相同的变量名进行赋值。
问题的解决方案是:
而不是
orm, err := xorm.NewEngine("postgres", connString)
使用
var err error
orm, err = xorm.NewEngine("postgres", connString)
基于 this 示例,我尝试编写一个程序来 return 来自数据库的一些数据。不幸的是,根据运行时控制台输出,(或多或少)相同的程序结构会在此处导致内存错误 err := orm.Find(&sensorDataEntry)
。
我在这里错过了什么?示例和我的程序都有使用 make() 创建的切片,并在 Find() 方法中使用引用。
有问题的代码:
package main
import (
"fmt"
"net/http"
"time"
"github.com/gorilla/mux"
_ "github.com/lib/pq"
//"database/sql"
"github.com/go-xorm/xorm"
)
var orm *xorm.Engine
func newRouter() *mux.Router {
r := mux.NewRouter()
r.HandleFunc("/sensorentries", GetSensorEntriesHandler).Methods("GET")
return r
}
type SensorDataEntry struct {
id int `xorm:"int"`
sensor_id string `xorm:"varchar(32)"`
key string `xorm:"varchar(128)"`
value float64 `xorm:"numeric(20,2)"`
created_at time.Time `xorm:"timestamp"`
}
func main() {
connString := "host=server.lan user=x password=x dbname=testdb sslmode=disable"
orm, err := xorm.NewEngine("postgres", connString)
//orm.ShowSQL(true)
if err != nil {
println(err)
return
}
if err = orm.Sync2(SensorDataEntry{}); err != nil {
return
}
r := newRouter()
http.ListenAndServe(":8080", r)
}
func GetSensorEntriesHandler(resp http.ResponseWriter, req *http.Request) {
sensorDataEntry := make([]SensorDataEntry, 0)
err := orm.Find(&sensorDataEntry)
if err != nil {
println(err)
}
fmt.Println(sensorDataEntry)
fmt.Fprintf(resp, "return text")
}
如 mkopriva 所述,问题是使用相同的变量名进行赋值。
问题的解决方案是:
而不是
orm, err := xorm.NewEngine("postgres", connString)
使用
var err error
orm, err = xorm.NewEngine("postgres", connString)