Пример xorm не работает: «ошибка времени выполнения: неверный адрес памяти или разыменование нулевого указателя» - PullRequest
0 голосов
/ 31 мая 2019

На основании этого примера я попытался написать программу, которая возвращала бы некоторые данные из базы данных.К сожалению, (более или менее) та же самая структура программы вызывает ошибки памяти здесь 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")
}

1 Ответ

1 голос
/ 31 мая 2019

Как отмечает mkopriva , проблема заключалась в том, что для присвоения использовалось то же имя переменной.

Решение проблемы было:

вместо

orm, err := xorm.NewEngine("postgres", connString)

использование

var err error
orm, err = xorm.NewEngine("postgres", connString)
...