首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GoLang PGX Postgresql

GoLang PGX Postgresql
EN

Stack Overflow用户
提问于 2020-02-12 08:35:50
回答 2查看 6.9K关注 0票数 2

我正在寻找从lib/pg切换到pgx,但我不能得到一个简单的工作选择在pgx中工作。我想知道是否有人能指出这段代码的错误所在。为什么它不工作?

对于lib/pg没有问题,但是对于pgx,它们肯定缺少一些东西。我修改了pgx示例代码中的测试代码,以测试我的select。

我已经发布了我修改的代码,以及代码运行时的错误。我不明白为什么会有无效的内存地址,因为select返回。也许有人可以指出这段代码是怎么回事。

代码语言:javascript
复制
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()
}

这是我得到的错误

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2020-02-12 08:48:50

您正在重新定义下面的conn

代码语言:javascript
复制
conn, err := pgx.Connect(context.Background(), os.Getenv("DATABASE_URL"))

所以你不是在分配全局conn

将其更改为:

代码语言:javascript
复制
var err error
conn, err=px.Connect(...)

根据语言规范:

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

conn没有在同一个块中定义,所以简短的声明是定义connerr,而不是赋值给conn

票数 2
EN

Stack Overflow用户

发布于 2020-05-14 07:10:25

invalid memory address or nil pointer dereference任何时候我看到这样的错误,通常都意味着我试图将一个值赋给一个空指针。但在你的情况下我什么也找不到。我在这段代码中没有发现任何错误,我做了同样的事情,并且工作正常。你可以看看HERE。有时os.Getenv不会加载.env文件,因此它会导致找不到文件,因此请尝试将数据库源代码复制到pgx,如示例代码所示。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60179427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档