什么阻止了我在 Go 中使用 pgx 的函数调用?

问题描述 投票:0回答:1

我正在编写一项服务,其中我是来自 PostgreSQL 的 UUID 的学生。我选择了pgx作为司机。我已经完全调试了我的程序,在我调用

row.Scan
后似乎没有任何内容被调用。我的连接正常,我能够与数据库交互(通过插入进行测试)。连接 URI 具有授予所有权限的用户,因此这不是问题。这是我的函数定义:

func (r *StudentPgRepo) GetStudentById(uuid *uuid.UUID) (*aggregate.Student, error) {
    row := r.pool.QueryRow(context.Background(), "SELECT * FROM students WHERE student_id = $1", uuid.String())

    student := new(aggregate.Student)
    if err := row.Scan(
        &student.Id, &student.FName, &student.LName, &student.PwHash, &student.Created,
        &student.Updated, &student.P1.FName, &student.P1.LName, &student.P1.Email,
        &student.P2.FName, &student.P2.LName, &student.P2.Email, &student.ParentDetails,
        &student.Timezone, &student.Country, &student.State, &student.City, &student.Age,
        &student.Gender, &student.Race, &student.NewStudent, &student.MealAssistance,
    ); err != nil {
        if err == pgx.ErrNoRows {
            return nil, ErrStudentNotFound
        }
        return nil, err
    }

    return student, nil
}

如果我需要提供任何其他详细信息,请告诉我。谢谢你。

这是我的函数调用:

dbpool, err := pgxpool.New(context.Background(), u.String())
if err != nil {
    panic(err)
}
defer dbpool.Close()

r, err := student.NewStudentPgRepo(dbpool)
if err != nil {
    panic(err)
}

uid := uuid.New()
_, err = r.GetStudentById(&uid)
if err != nil {
    panic(err)
}
postgresql go pgx
1个回答
0
投票

这可能无法解决您的问题,因为我们需要深入了解更多信息。不过,我的代码可以工作,也可以作为您的起点。就在下面,您可以找到它:

package main

import (
    "context"
    "fmt"

    "github.com/jackc/pgx/v5"
)

type Todo struct {
    Id   int
    Name string
}

func main() {
    conn, err := pgx.Connect(context.Background(), "postgres://postgres:postgres@localhost:54322/postgres")
    if err != nil {
        panic(err)
    }
    defer conn.Close(context.Background())

    var todo Todo
    row := conn.QueryRow(context.Background(), "select id, name from todos where id = $1", 2)
    // row := conn.QueryRow(context.Background(), "select id, name from todos where id = $1", 3) // "3" not found
    if err := row.Scan(&todo.Id, &todo.Name); err != nil {
        if err == pgx.ErrNoRows {
            fmt.Println("record not found")
            return
        }
        panic(err)
    }
    fmt.Println(todo)
}

我使用以下命令运行 PostgreSQL 实例:

docker run -d -p 54322:5432 -e POSTGRES_PASSWORD=postgres postgres

在数据库中,我使用以下脚本手动创建了一个表:

CREATE TABLE public.todos (
id INTEGER CONSTRAINT todos_pk PRIMARY KEY,
name TEXT
);

然后,我只是为了演示而添加了两条记录。
如果这解决了您的问题,那很好,否则请通过添加缺少的详细信息来编辑问题,我将尝试深入研究它。请告诉我,谢谢!

编辑 - 连接池

我刚刚使用

github.com/jackc/pgx/v5/pgxpool
包提供的连接池功能更新了代码。

package main

import (
    "context"
    "fmt"

    "github.com/jackc/pgx"
    "github.com/jackc/pgx/v5/pgxpool"
)

type Todo struct {
    Id   int
    Name string
}

func main() {
    pool, err := pgxpool.New(context.Background(), "postgres://postgres:postgres@localhost:54322/postgres")
    if err != nil {
        panic(err)
    }
    defer pool.Close()

    var todo Todo
    row := pool.QueryRow(context.Background(), "select id, name from todos where id = $1", 2)
    // row := conn.QueryRow(context.Background(), "select id, name from todos where id = $1", 3) // "3" not found
    if err := row.Scan(&todo.Id, &todo.Name); err != nil {
        if err == pgx.ErrNoRows {
            fmt.Println("record not found")
            return
        }
        panic(err)
    }
    fmt.Println(todo)
}

代码非常相似,并且和以前一样工作。如果您还有其他问题请告诉我,谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.