gorm RowsAffected() 返回0的问题

本文详细解析了在GORM中如何正确使用RowsAffected()方法来获取更新数据的条数。通过实例演示了常见错误用法及正确实践,帮助开发者避免陷阱,有效监控数据更新状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中,经常需要更新数据,并且要获取到更新的条数从而做不同的操作。在gorm中提供了RowsAffected()的方法获取更新的条数。但是我们执行一下的代码会发现这个方法总是输出0,一点都不好使。

db := DBagent.DB.Table("user_tab")
err := db.Where( "id = ?", 1).Updates(updateInfo).Error()
println(db.RowsAffected())  // 总是打印0

 

这是因为gorm中,如Find,Create,Update等方法一旦被调用后会马上跟数据库进行交互然后改变数据,并且会返回一个db对象,该对象中会有实际的rowsAffected等数据。因此应该这么使用RowsAffected()方法:

db := DBagent.DB.Table("user_tab")
db = db.Where( "id = ?", 1).Updates(updateInfo) // 此处获取到的db对象就包含相应的值

err := db.Error()
println(db.RowsAffected())  // 打印相应的更新条数

 

03-19
### GORM 的基本使用方法及示例 GORM 是一种强大的 ORM 库,用于简化 Go 语言中的数据库操作。以下是关于其核心功能的详细介绍以及一些实际使用的代码示例。 #### 安装 GORM 和驱动程序 要安装 GORM 及 SQLite 驱动程序,可以运行以下命令: ```bash go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite ``` 这一步骤会将必要的依赖项下载到项目中[^1]。 --- #### 连接数据库并初始化配置 连接数据库时可以通过 `gorm.Open` 方法完成,并可传递自定义配置参数。例如: ```go package main import ( "gorm.io/driver/sqlite" "gorm.io/gorm" ) func initDB() (*gorm.DB, error) { db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{ NamingStrategy: schema.NamingStrategy{ SingularTable: true, TablePrefix: "app_", }, }) if err != nil { return nil, err } return db, nil } ``` 上述代码展示了如何设置表名前缀 (`app_`) 并启用单数表名模式[^2]。 --- #### 创建模型结构体 在 GORM 中,通常通过定义结构体来表示数据库表及其字段。例如: ```go type User struct { ID uint `json:"id"` Name string `json:"name" gorm:"size:100;not null"` Email string `json:"email" gorm:"uniqueIndex;not null"` } // 自动迁移创建表 db.AutoMigrate(&User{}) ``` 此部分演示了如何利用标签指定字段属性,如大小限制、唯一索引等。 --- #### 查询数据 执行简单的查询操作如下所示: ```go var user User if result := db.First(&user, 1); result.Error != nil { panic(result.Error) } else { fmt.Println(user.Name) } ``` 这段代码尝试查找 ID 为 1 的记录;如果找不到,则返回错误信息。 对于复杂查询场景(比如涉及多张表),可以借助 Joins 方法实现联结查询。例如获取特定玩具名称对应的儿童列表: ```go type Child struct { gorm.Model Name string Toys []Toy `gorm:"foreignKey:ChildID"` } type Toy struct { gorm.Model Name string ChildID uint } func GetChildrenWithSpecificToy(toyName string) ([]Child, error) { var children []Child err := db.Preload("Toys"). Joins("LEFT JOIN toys ON toys.child_id = children.id"). Where("toys.name = ?", toyName). Find(&children).Error return children, err } ``` 这里结合 Preload 加载关联数据的同时还加入了额外过滤条件[^3]。 --- #### 插入新纪录 向数据库插入一条新的用户记录可通过 Create 方法轻松达成: ```go newUser := User{Name: "Alice", Email: "[email protected]"} result := db.Create(&newUser) if result.Error != nil { log.Fatalf("Failed to create record: %v\n", result.Error) } fmt.Printf("Newly created user's id is %d.\n", newUser.ID) ``` 成功后即可获得刚生成的对象实例连同主键值一起返回。 --- #### 更新现有条目 更新已有实体的方法之一就是调用 Save 或 Updates 函数: ```go updateResult := db.Model(&user).Update("Name", "Bob") if updateResult.RowsAffected == 0 { log.Println("No rows were updated.") } ``` 注意区别在于前者会覆盖整个对象而后者仅修改指定字段。 --- #### 删除记录 最后删除某条记录也很简单: ```go deleteRes := db.Delete(&user) if deleteRes.RowsAffected > 0 { log.Println("Record successfully deleted!") } ``` 确认影响行数大于零即代表删除成功。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值