GORM

GORM使用注意事项

事务

//使用了gorm的事务,作为小程序赞赏时,用户账户扣款,文章获得赞赏,用户账户余额减少。

//添加某个文章某个用户打赏记录
func AddUserPay(articleid, uid int64, amount int) error {
	//获取DB
	db := GetDB()
	// 注意,当你在一个事务中应使用 tx 作为数据库句柄
	tx := db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()
 
	if err := tx.Error; err != nil {
		return err
	}
	//保证文章id正确
	var article Article
	err := db.Where("id = ?", articleid).First(&article).Error
	if err != nil {
		tx.Rollback()
		return err
	}
	// user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
	// db.Create(&user)
	if err := tx.Create(&Pay{UserID: uid, ArticleID: articleid, Amount: amount}).Error; err != nil {
		tx.Rollback()
		return err
	}
	//更新用户账户余额money
	//1.首先保证账户存在
	// money := Money{UserID: uid}
	var money Money
	err = db.Where("user_id = ?", uid).First(&money).Error
	if err != nil {
		tx.Rollback()
		return err
	}
	//2.用户账户余额保证大于0
	newamount := money.Amount - amount
	if newamount < 0 {
		tx.Rollback()
		return err
	}
	//3.账户修改余额
	rowsAffected := tx.Model(&money).Update("amount", newamount).RowsAffected
	if rowsAffected == 0 {
		tx.Rollback()
		return nil
	}
 
	return tx.Commit().Error
 
}

Update

WARNING when update with struct, GORM will not update fields that with zero value

当用结构体更新的时候,当结构体字段的值是""或者0,false等,这些字段就不会更新。

如何更新字段值是0,"",false的字段?
① 使用更新所有字段方法(save)
② 使用更新选中字段的方法
③ 使用sql语句方法

常见问题

如何将数据库中的某个字段更新为空

ORM框架自带的update方法无法将某个字段更新为空,变通的做法如下

sql:="update table_name set model_id = null where..."
err:=db.Exec(sql)
### GORM 基本概念与功能 GORM 是一种用于 Go 的对象关系映射 (ORM) 工具,它提供了简单而强大的接口来操作数据库[^1]。通过 GORM,开发者可以轻松实现数据模型定义、迁移以及 CRUD 操作等功能。 #### 安装 GORM 和驱动程序 要使用 GORM,首先需要安装其依赖项和对应的数据库驱动程序。以下是针对不同数据库的安装命令: ```bash go get -u gorm.io/gorm go get -u gorm.io/driver/mysql # 对于 MySQL 数据库 go get -u gorm.io/driver/postgres # 对于 PostgreSQL 数据库 go get -u gorm.io/driver/sqlite # 对于 SQLite 数据库 ``` #### 创建连接到数据库实例 下面是一个简单的例子,展示如何创建并初始化一个 GORM 实例并与数据库建立连接: ```go package main import ( "fmt" "gorm.io/driver/sqlite" "gorm.io/gorm" ) func main() { db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { fmt.Println(err) return } fmt.Println("Connected to the database successfully!") } ``` 此代码片段展示了如何打开一个新的 SQLite 连接,并打印成功消息如果一切正常运行的话[^1]。 #### 自动迁移支持 GORM 提供了一个自动迁移的功能,允许基于结构体字段自动生成表结构变化脚本。这使得管理数据库模式变得更加容易。 ```go type User struct { ID uint Name string Age int } db.AutoMigrate(&User{}) // 将会根据 `User` 结构体创建对应的数据表 ``` 上面的例子说明了当调用 AutoMigrate 方法时,GORM 如何依据给定的结构体去更新或者新建相应的表格。 #### 执行基本查询操作 执行基础增删改查的操作也非常直观,在这里提供几个常见的示例: 增加记录: ```go user := User{Name: "John Doe", Age: 30} result := db.Create(&user) fmt.Println(result.RowsAffected) // 输出受影响行数 ``` 查找单条记录: ```go var user User db.First(&user, 1) // 查找 ID=1 的第一条记录 fmt.Printf("%v\n", user.Name) ``` 删除记录: ```go db.Delete(&user, 1) // 删除 ID=1 的记录 ``` 这些只是 GORM 功能的一小部分演示;更多高级特性如事务处理、嵌套预取等都可以在其官方文档找到详细描述[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值