15.GORM原生SQL
# 01.原生SQL
# 1.1 model结构体
models/user.go
package models
type User struct {
Id int
Username string
Age int
Email string
AddTime int
}
//定义结构体操作的数据库表
func (User) TableName() string {
return "user"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1.2 增删改(原生SQL)
func (c *UserController) UserSelect() {
// 1、使用原生sql给user表增加一条数据
res := models.DB.Exec("insert into user(username,age,email) values(?,?,?)", "6666", 11, "xxxxx@qq.com")
// 2、使用原生sql删除user表中的一条数据
res := models.DB.Exec("delete from user where id =?", 6)
// 3、使用原生sql修改user表中的一条数据
res := models.DB.Exec("update user set username=? where id=?", "zhangsannew", 1)
c.Data["json"] = res
c.ServeJSON()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 1.3 原生SQL查询
原生sql基本查询
func (c *UserController) UserSelect() {
user := []models.User{}
// 1、查询User表中所有的数据
models.DB.Raw("select * from user").Scan(&user)
// 2、查询uid=2的数据
models.DB.Raw("select * from user where id=?", 2).Scan(&user)
c.Data["json"] = user
c.ServeJSON()
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
打印查询的数据
func (c *UserController) UserSelect() {
// 1、统计user表的数量
var num int
res := models.DB.Raw("select count(1) from user").Row()
res.Scan(&num) // 5
fmt.Println("数据库表里面有", num, "条数据")
// 2、把查询到的数据赋值给变量
var username string
var email string
res := models.DB.Raw("select username,email from user where id=1").Row()
res.Scan(&username, &email)
fmt.Println(username, email) // zhangsan zhangsan.qq.com
// 3、打印user表的所有数据
var username string
var email string
rows, _ := models.DB.Raw("select username,email from user").Rows()
defer rows.Close() //操作完毕关闭
for rows.Next() {
rows.Scan(&username, &email)
fmt.Println(username, email)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 02.GORM 中使用事务
GORM 默认会将单个的 create, update, delete 操作封装在事务内进行处理,以确保数据的完整性。
如果想把多个 create, update, delete 操作作为一个原子操作,Transaction 就是用来完成这个的。
# 2.1 事务(手动控制)
// 开启事务
tx := db.Begin()
// 在事务中做一些数据库操作 (这里应该使用 'tx' ,而不是 'db')
tx.Create(...)
// ...
// 有错误时,手动调用事务的 Rollback()
tx.Rollback()
// 无错误时,手动调用事务的 Commit()
tx.Commit()
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 2.2 model表
package models
type Bank struct {
Id int
Username string
Balance float32
}
func (Bank) TableName() string {
return "bank"
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 2.3 张三给李四转账
package controllers
import (
"beegogorm/models"
"github.com/astaxie/beego"
"github.com/jinzhu/gorm"
)
type TransactionsController struct {
beego.Controller
}
func (c *TransactionsController) TransGet() {
defer func() {
if err := recover(); err != nil {
beego.Error(err)
c.Ctx.WriteString("失败")
}
}()
TransferAccounts(models.DB)
c.Ctx.WriteString("转账成功222")
}
func TransferAccounts(db *gorm.DB) error {
return db.Transaction(func(tx *gorm.DB) error { //开始事务
// 张三账户减去 100
u1 := models.Bank{Id: 1}
tx.Find(&u1)
u1.Balance = u1.Balance - 100
if err := tx.Save(u1).Error; err != nil {
return err //Rollback
}
// panic("遇到了错误")
// 李四账户增加 100
u2 := models.Bank{Id: 2}
tx.Find(&u2)
u2.Balance = u2.Balance + 100
if err := tx.Save(u2).Error; err != nil {
return err //Rollback
}
return nil //Commit()
})
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
上次更新: 2024/3/13 15:35:10