gpt4 book ai didi

postgresql - GORM 不会根据主键返回正确的记录

转载 作者:行者123 更新时间:2023-12-01 22:20:30 28 4
gpt4 key购买 nike

我是 GO 的新手,我正在将我的 CRUD 应用程序从使用普通 SQL 迁移到 GORM,然后我遇到了基于主键的查询将在匹配源时返回主键和 nil 的问题,而它应该返回值/将自身记录在:https://gorm.io/docs/query.html#Retrieving-with-primary-key
我期待查询的值

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}
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
}
谢谢!

最佳答案

您可以阅读 godoc关于 DB.First :
Screencap of DB.First documentation on godoc
注意2件事:

  • 第一个参数out确实是让你输出查询结果。
  • 返回值为数据库实例*DB ,实际上不是查询结果。

  • 您也可以阅读官方网站关于 Query :

    Retrieving a single object

    GORM provides First, Take, Last method to retrieve a single object from the database, it adds LIMIT 1 condition when querying the database, and it will return error ErrRecordNotFound if no record found.

    // Get the first record ordered by primary key
    db.First(&user)
    // SELECT * FROM users ORDER BY id LIMIT 1;

    // Get one record, no specified order
    db.Take(&user)
    // SELECT * FROM users LIMIT 1;

    // Get last record, order by primary key desc
    db.Last(&user)
    // SELECT * FROM users ORDER BY id DESC LIMIT 1;

    result := db.First(&user)
    result.RowsAffected // returns found records count
    result.Error // returns error

    // check error ErrRecordNotFound
    errors.Is(result.Error, gorm.ErrRecordNotFound)

    简而言之,您应该从变量 u 中获得结果。而不是 result .
    func main() {
    var u user
    db := loadDbSecret()
    result := db.First(&u, 1)

    fmt.Printf("%v\n", u)
    }

    关于postgresql - GORM 不会根据主键返回正确的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63862375/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com