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

hmtdttj4  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(151)

我正在写一个服务,其中我的学生从一个UUID与PostgreSQL。我选择pgx(https://github.com/jackc/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
}

请让我知道如果有任何其他细节,我应该提供。谢谢你。
下面是我的函数调用:

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)
    }
y53ybaqx

y53ybaqx1#

可能,这不会解决您的问题,因为我们需要深入研究它与更多的信息。然而,我的代码工作,可以作为你的起点。在下面,你可以找到它:

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

在DB中,我用下面的脚本手动创建了一个表:

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)
}

代码非常相似,它像以前一样工作。如果您有任何其他问题,请告诉我,谢谢!

相关问题