我正在寻找从lib/pg切换到pgx,但我不能得到一个简单的工作选择在pgx中工作。我想知道是否有人能指出这段代码的错误所在。为什么它不工作?
对于lib/pg没有问题,但是对于pgx,它们肯定缺少一些东西。我修改了pgx示例代码中的测试代码,以测试我的select。
我已经发布了我修改的代码,以及代码运行时的错误。我不明白为什么会有无效的内存地址,因为select返回。也许有人可以指出这段代码是怎么回事。
package main
import (
"context"
"fmt"
"os"
"github.com/jackc/pgx"
)
var conn *pgx.Conn
var err error
func main() {
conn, err = pgx.Connect(context.Background(), os.Getenv("DATABASE_URL"))
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to connection to database: %v\n", err)
os.Exit(1)
}
listTasks()
defer conn.Close(context.Background())
}
func listTasks() error {
rows, _ := conn.Query(context.Background(), "select * from signal")
for rows.Next() {
var s string
var id int32
var v float64
var description string
var description2 string
err := rows.Scan(&s, &id, &v, &description, &description2)
if err != nil {
return err
}
fmt.Printf("%d. %s\n", id, description)
}
return rows.Err()
}这是我得到的错误
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x4 pc=0x29eb30]
goroutine 1 [running]:
github.com/jackc/pgx.(*Conn).Query(0x0, 0x38deb8, 0x1414090, 0x3238d7, 0x14, 0x0, 0x0, 0x0, 0x14126c0, 0x192e8, ...)
/home/forex/go/src/github.com/jackc/pgx/conn.go:585 +0x18
main.listTasks(0x38deb8, 0x1414090)
/usr/local/forex/test-pgx.go:27 +0x58
main.main()
/usr/local/forex/test-pgx.go:22 +0xbc发布于 2020-02-12 08:48:50
您正在重新定义下面的conn:
conn, err := pgx.Connect(context.Background(), os.Getenv("DATABASE_URL"))所以你不是在分配全局conn。
将其更改为:
var err error
conn, err=px.Connect(...)根据语言规范:
与常规变量声明不同,简短的变量声明可以重新声明变量,前提是它们最初是在同一个块(如果块是函数体,则是参数列表)中以相同的类型声明的,并且至少有一个非空白变量是新的。
conn没有在同一个块中定义,所以简短的声明是定义conn和err,而不是赋值给conn。
发布于 2020-05-14 07:10:25
invalid memory address or nil pointer dereference任何时候我看到这样的错误,通常都意味着我试图将一个值赋给一个空指针。但在你的情况下我什么也找不到。我在这段代码中没有发现任何错误,我做了同样的事情,并且工作正常。你可以看看HERE。有时os.Getenv不会加载.env文件,因此它会导致找不到文件,因此请尝试将数据库源代码复制到pgx,如示例代码所示。
https://stackoverflow.com/questions/60179427
复制相似问题