Postgresql GORM不会基于主键返回正确的记录
我是新手,我正在将我的CRUD应用程序从使用普通SQL迁移到GORM,然后我遇到了一些问题,基于主键的查询在匹配源时将返回主键和nil,而它应该返回值/记录本身,如中所述: 我期待着这个查询的值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 ----+------+-----+------
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
}