GoLang PGX Postgresql

3
我想从lib/pg切换到pgx,但我无法在pgx中使简单的select语句工作。请问有人能指出这段代码有什么问题吗?与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
2个回答

3

您在下面重新定义了conn

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

所以你没有分配全局变量conn。将其改为以下内容:
var err error
conn, err=px.Connect(...)

根据语言规范:
与普通变量声明不同,短变量声明可以重新声明变量,前提是它们最初在同一块中(或参数列表如果块是函数体)用相同类型进行了声明,并且至少有一个非空变量是新的。
`conn`未在同一块中定义,因此短声明将定义`conn`和`err`,而不是对`conn`进行赋值。

当我将var err error作为全局变量时,我只得到一个空的返回值。就像select语句根本没有被执行一样。 - user10078199
不要声明一个全局错误变量。将其在本地声明。 - Burak Serdar
错误很明显:底层列的值无法分配给*字符串。请使用列名而不是selec *,并查看您正在处理的列的类型。 - Burak Serdar
似乎问题不在这里,我在Scan函数调用中做错了什么。rows.Next():无法将值扫描到dest[1]:无法将1赋值给*string。返回值没有从PostgreSQL返回的游标进行类型转换。 - user10078199
也许你可以把这个问题单独提出来问,其他人可能会有帮助。 - Burak Serdar
显示剩余2条评论

1

无效的内存地址或空指针引用,每当我看到这样的错误,通常意味着我正在尝试将一个值分配给一个空指针。但在你的情况下,我找不到任何问题。 好吧,我发现这段代码没有任何问题,我做了同样的事情,它可以工作。你可以看一下这里。有时候os.Getenv不会加载.env文件,所以会导致文件未找到,请尝试将数据库源代码复制到pgx中,就像示例代码中显示的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接