快速学习gorm 框架

go-orm

介绍

godemo是一款go目前主流的orm框架

软件架构

官方文档 GORM - The fantastic ORM library for Golang, aims to be developer friendly.

使用说明

安装教程

1.设置代理

go env -w  GOPROXY=https://goproxy.cn,direct

2.打算使用gin 搭配gorom 进行学习模拟web开发

## 安装gin
go get -u github.com/gin-gonic/gin
#数据库驱动和orm
go get gorm.io/driver/mysql
go get gorm.io/gorm

连接

数据库连

  // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
  dsn := "用户名:密码@tcp(127.0.0.1:3306)/数据库名?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
   })

添加配置 自定义驱动


import (
  _ "example.com/my_mysql_driver"
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

db, err := gorm.Open(mysql.New(mysql.Config{
  DriverName: "my_mysql_driver",
  DSN: "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local", // data source name, 详情参考:https://github.com/go-sql-driver/mysql#dsn-data-source-name
}), &gorm.Config{})
	// 日志配置
	var mysqlLogger logger.Interface
	// 要显示的日志等级
	mysqlLogger = logger.Default.LogMode(logger.Info)
	db, _ := gorm.Open(mysql.New(mysql.Config{
		// leave blank for default driver
		DSN: "root:111111@tcp(127.0.0.1:3306)/ruiji?charset=utf8&parseTime=True&loc=Local", // data source name, 详情参考:https://github.com/go-sql-driver/mysql#dsn-data-source-name
	}), &gorm.Config{
		Logger:                 mysqlLogger, //注册
		SkipDefaultTransaction: true,        // 禁用默认事务
	})
	sqlDB, _ := db.DB()

	// 设置空闲连接池中的最大连接数。ol.
	sqlDB.SetMaxIdleConns(10)

	// 设置与数据库的最大打开连接数
	sqlDB.SetMaxOpenConns(100)

	// 设置可以重复使用连接的最长时间。
	sqlDB.SetConnMaxLifetime(time.Hour)

CRUD

假如有model


type Student struct {
	ID uint // 默认使用ID作为主键
	//设置字段长度为2
	Name  string  `gorm:"size:10"`
	Sex   string  `gorm:"size:2"`
	Email *string // 使用指针是为了存空值
	Age   int
}

gorm中的tag约束 除开上述 还有以下 可以做到创建表时候约束

创建表

如果存在也不会报错 如果结构体和数据库模型 不一样则执行的是alter 更改数据库的操作

使用 AutoMigrate 方法自动迁移你的 schema,这将会创建数据库中不存在的表。
db.AutoMigrate(&Product{})

插入数据

单挑数据插入

db.Create(s) s是该映射结构体的指针

func insertStudent(c *gin.Context) {
	s := new(Student)
	if err := c.ShouldBindQuery(s); err != nil {
		return
	} else {
		db.Create(s)
		c.JSON(200, gin.H{
			"data":    s,
			"message": "创建用户成功",
		})
	}
}

批量插入 同样 参数传递结构体切片即可

func bentchInserter(c *gin.Context) {
   
	students := make([]Student, 10)
	for i := 1; i <= 20; i++ {
   
		students = append(students, Student{
   
			Name: "测试" + strconv.Itoa(i),
			Age:  i,
			Sex:  "男",
			//Email: nil,
		})
	}
	db.Create(&students)
	c.JSON(200, gin.H{
   
		"data":    students,
		"message": "批量创建用户成功",
	})
}

插入后该指针结构体的id字段就会被填充

删除

api delete

//第一个参数 是映射结构体指针 第二个参数是id 只有空结构体指针时候代表删除全表 
db.Delete(s, id)

等效

s.ID = uint(parsedID)
db.Delete(s) 

Or where 拼接查询条件 可以使用?方式进行拼接sql

	db.Or("age<?", 18).Where("name", "测试张三").Delete(s, id) // 根据主键删除

日志

[4.352ms] [rows:1] DELETE FROM students WHERE name = ‘测试张三’ AND students.id = ‘1’

注意

gorm 对于不携带条件的批量修改字段 比如UPDATE students SET sex=‘妈妈’() ,DELETE FROM students 这俩个sql正常来说是会改变整个表的记录,但是gorom 并不会去执行

sql1 go中的api

s := new(Student)
db.Model(s).Update("sex", "妈妈")

sq2

db.Delete(s)

但是加一个简单的条件

db.Model(s).Where(
  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝胖子不是胖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值