不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • GO基础

  • 面向对象

  • 并发编程

  • 常用库

  • 数据库操作

    • GORM

      • 01.GORM入门
      • 02.GORM操作
      • 03.GORM查询
      • 04.GORM 关联查询
      • 05.GORM原生SQL
        • 01.原生SQL
          • 1.1 model结构体
          • 1.2 增删改(原生SQL)
          • 1.3 原生SQL查询
        • 02.GORM 中使用事务
          • 2.1 事务(手动控制)
          • 2.2 model表
          • 2.3 张三给李四转账
      • 06.GORMv2
      • 07.GORMgen
    • sqlx

    • database-sql

    • GORMv2

    • go-redis

    • redigo

    • elastic

  • Beego框架

  • Beego商城

  • GIN框架

  • GIN论坛

  • 微服务

  • 设计模式

  • Go
  • 数据库操作
  • GORM
xiaonaiqiang
2021-06-12
目录

05.GORM原生SQL

# 01.原生SQL

  • 官方 (opens new window)

# 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

# 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

# 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
  • 打印查询的数据
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

# 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.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 张三给李四转账

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
上次更新: 2024/3/13 15:35:10
04.GORM 关联查询
06.GORMv2

← 04.GORM 关联查询 06.GORMv2→

最近更新
01
04.数组双指针排序_子数组
03-25
02
08.动态规划
03-25
03
06.回溯算法
03-25
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式