Postgresql GORM不会基于主键返回正确的记录

Postgresql GORM不会基于主键返回正确的记录,postgresql,go,crud,Postgresql,Go,Crud,我是新手,我正在将我的CRUD应用程序从使用普通SQL迁移到GORM,然后我遇到了一些问题,基于主键的查询在匹配源时将返回主键和nil,而它应该返回值/记录本身,如中所述: 我期待着这个查询的值 postgres=# SELECT * FROM users WHERE id = 1; id | name | age | created_at | updated_at | deleted_at | location ----+------+-----+------

我是新手,我正在将我的CRUD应用程序从使用普通SQL迁移到GORM,然后我遇到了一些问题,基于主键的查询在匹配源时将返回主键和nil,而它应该返回值/记录本身,如中所述:

我期待着这个查询的值

postgres=# SELECT * FROM users WHERE id = 1;
 id | name | age |         created_at         | updated_at | deleted_at | location
----+------+-----+----------------------------+------------+------------+----------
  1 | Rick |  22 | 2020-09-12 11:34:14.366674 |            |            | Toronto
(1 row)
相反,我得到了这个

&{0xc0000c0900 <nil> 1 0xc00009f860 0}
谢谢

您可以阅读以下内容:

注意2件事:

第一个参数out实际上是供您输出查询结果的。 返回的值是数据库实例*DB,实际上不是查询结果。 您还可以在官方网站上阅读以下内容:

检索单个对象 GORM提供First、Take、Last方法从数据库检索单个对象,在查询数据库时添加LIMIT 1条件,如果未找到记录,则返回errorRecordNotFound错误

//获取按主键排序的第一条记录 db.First和user //按id限制1从用户订单中选择*; //获取一条记录,没有指定顺序 db.Take和user //从用户限制1中选择*; //获取最后一条记录,按主键顺序描述 db.Last和user //从用户订单中选择*按id描述限制1; 结果:=db.First和user result.RowsAffected//返回找到的记录数 result.Error//返回错误 //检查错误ErrRecordNotFound errors.Isresult.Error,gorm.ErrRecordNotFound 简而言之,您应该从变量u而不是结果中获取结果

func main{ var u用户 db:=loadDbSecret 结果:=db.First&u,1 fmt.Printf%v\n,u }
试着打印u而不是结果,我相信它与db的实例相同,目的是支持方法链接。返回类型在中有很好的说明,请确保在遇到问题时查看它。请尝试fmt。Printfuser:%v\n,u,而不是打印结果。如果没有必要,请尝试避免使用图像,尤其是图像更易于复制和粘贴,更重要的是,任何感兴趣的程序(如搜索引擎)都可以轻松理解,盲人屏幕阅读器等。我确实有链接到原文。但我在复制原文时遇到了问题。这里的图像是为了更好的视觉效果。对于需要屏幕阅读器的人来说,这不应该是个问题。此外,alt文本应该足以解释图像。对,但是如何使用库检索记录而没有结果呢?我试图提取在包模型下定义的类型用户结构中的用户记录?抱歉,新手提问,这也在官方示例中。您可以检查result.RowsAffected字段以查看是否有任何结果。或者,您可以简单地检查用户对象是否已填充,例如,id字段可能为0。
package main

import (
    "fmt"
    "go-postgres/models"
    "log"
    "os"

    "github.com/joho/godotenv"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

type user models.User

func main() {
    var u user
    db := loadDbSecret()
    result := db.First(&u, 1)

    fmt.Println(result)

}

func loadDbSecret() *gorm.DB {
    err := godotenv.Load(".env")

    if err != nil {
        log.Fatalf("Error loading .env file")
    }

    db, err := gorm.Open(postgres.Open(os.Getenv("POSTGRES_URL")), &gorm.Config{})

    if err != nil {
        panic(err)
    }

    return db
}