【问题标题】:Must I save a record after creating it to save it in SQLITE with Gorm?创建记录后是否必须保存记录才能使用 Gorm 将其保存在 SQLITE 中?
【发布时间】:2021-12-08 22:35:55
【问题描述】:

我正在使用带有 Gorm 的 SQLITE 数据库,需要保存一条新记录。

我遇到的问题是,当我创建一条记录并重新启动程序时,在数据库中找不到该记录。创建后需要保存记录吗?

The example program given in the Gorm documentation 不保存记录。

【问题讨论】:

  • “我必须在创建记录后保存它才能使用 Gorm 将其保存在 SQLITE 中吗?” -- 不。您要么没有成功创建记录(您是否在创建后检查了错误?),或者您没有创建您认为的内容,因此您正在尝试检索其他内容。或者您正在使用没有提交的手动事务。或许,如果您需要更具体的帮助,请考虑分享不适合您的代码。
  • @mkopriva 我确实检查了创建操作的错误,但没有。我没有指定我不使用手动交易。我不做任何交易。我认为 gorm 或 sqlite 会处理它。如何确保我的记录保存在数据库中?我看到保存了其他表的一些记录。我将做一个最小的例子来重现问题并提供我的问题。
  • 我已经在我的机器上测试了普通的First 调用,如果没有找到则Create。运行程序一次,Create 被调用。第二次运行程序,First 成功,Createnot 调用了。因此,在默认设置中,Create 可以正常工作。如果你设法创建了一个minimal reproducible example,我会看看它。
  • @mkopriva 非常感谢您的帮助。这证明我的假设是正确的。所以我的代码中一定有一个错误。如果你提供这个作为答案,我会验证它。

标签: sqlite go go-gorm


【解决方案1】:

您不必Save 已传递给Create 的记录。

您可以通过运行以下命令对此进行测试:

main.go

package main

import (
    "fmt"
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

type Product struct {
    gorm.Model
    Code  string
    Price uint
}

func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    db.AutoMigrate(&Product{})

    var product Product
    if db.First(&product).Error == gorm.ErrRecordNotFound {
        fmt.Println("no product record, creating now...")
        db.Create(&Product{Code: "D42", Price: 100})
    } else {
        fmt.Printf("product record found: %v", product)
    }
}
go run main.go
no product record, creating now...
go run main.go
product record found: { ... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2020-01-05
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    相关资源
    最近更新 更多