GoLang PGX Postgresql

Я хочу переключиться с 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

2 ответа

Вы переопределяете conn ниже:

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

Значит, вы не назначаете глобальный conn.

Измените это на:

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

Согласно спецификации языка:

В отличие от обычных объявлений переменных, краткое объявление переменных может повторно объявлять переменные при условии, что они были первоначально объявлены ранее в том же блоке (или в списках параметров, если блок является телом функции) с тем же типом и по крайней мере одной из непустых переменных. новый.

conn не определен в том же блоке, поэтому краткое объявление определяет conn а также err, вместо присвоения conn.

invalid memory address or nil pointer dereferenceКаждый раз, когда я вижу такую ​​ошибку, обычно это означает, что я пытаюсь присвоить значение указателю nil. Но в вашем случае я ничего не нашел. Что ж, я не нашел ничего плохого в этом коде, я сделал то же самое, и он работает. Вы можете посмотреть ЗДЕСЬ. иногда os.Getenv не загружает файл.env, поэтому файл не найден, поэтому попробуйте скопировать источник базы данных в pgx, как показано в примере кода.

Другие вопросы по тегам