2

我希望从 lib/pg 切换到 pgx,但我无法获得一个简单的工作选择来在 pgx 中工作。想知道是否有人可以指出这段代码有什么问题。为什么它不工作?

lib/pg 没问题,但 pgx 肯定是缺少的东西。我修改了 pgx 示例代码中的测试代码来测试我的选择。

我已经发布了我修改的代码以及代码运行时的错误。由于选择返回,我看不到我怎么会有无效的内存地址。也许有人可以指出这段代码发生了什么。

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
4

2 回答 2

3

您正在重新定义conn以下内容:

conn, err := pgx.Connect(context.Background(), os.Getenv("DATABASE_URL"))

所以你没有分配全局conn.

将其更改为:

var err error
conn, err=px.Connect(...)

根据语言规范:

与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初是在同一块(或参数列表,如果该块是函数体)中以相同类型声明的,并且至少有一个非空白变量是新的。

conn没有在同一个块中定义,所以简短的声明是定义connand err,而不是分配给conn.

于 2020-02-12T00:48:50.460 回答
1

invalid memory address or nil pointer dereference每当我看到这样的错误时,通常意味着我正在尝试为 nil 指针赋值。但在你的情况下,我找不到任何东西。好吧,我发现这段代码没有任何问题,我做了同样的事情并且它有效。你可以看看这里。有时 os.Getenv 不会加载 .env 文件,因此导致找不到文件,因此请尝试将数据库源复制到 pgx,如示例代码所示。

于 2020-05-13T23:10:24.510 回答