GORM基础 | 青训营笔记

71 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

青训营课程笔记 & 青训营大项目笔记

ORM简介

在软件项目中,数据库是数据存储和访问的重要组件

在我所知道的django框架的MTV模型中,即model-template-view模式:model负责与数据库交互、template负责生成html页面、view负责接收和处理请求,调用model和template,返回相应

其中model层则是软件系统与数据库系统进行交互的重要组件,以MYSQL数据库为例,ORM组件将原本要实行在数据库的SQL语句进行封装成为函数供系统调用,这样一方面简化了软件代码架构,另一方面对于SQL注入,很多ORM组件库都有识别、防止的作用,为数据库交互提供了一定安全性

GORM运用

ORM在软件系统中基础操作有一系列CRUD操作,参考GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

连接配置数据库:

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)
func main() {
  // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  //连接到数据库
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

根据现有数据库初始化

import (   "database/sql"   "gorm.io/driver/mysql"   "gorm.io/gorm" )  
sqlDB, err := sql.Open("mysql", "mydb_dsn") //打开现有数据库
gormDB, err := gorm.Open(mysql.New(mysql.Config{   Conn: sqlDB, }), &gorm.Config{})

其中,gorm支持数据库访问更新的钩子函数,其运用与django的modelform类似

创建表:

type TestTb struct {
	Username string
	Password string
	gorm.Model
}

其中,gorm.Model为gorm自定义类型,定义了表中数据ID自增长,数据创建时间、更新时间、删除时间等

表结构定义完成后,可使用gorm的自动迁移AutoMigrate()方法创建表,即将go代码中定义的结构妆化成sql语句在数据库中执行并创建表

err := db.AutoMigrate(&TestTb) 可通过err调用判断表创建情况

表数据的操作:

查询:

cdt := User{Name:"xxx"}//查询条件结构体

res := db.First(&cdt)//返回查询的第一条记录
res := db.Find(&cdt)//返回查询所有记录
res := db.Where("age > ?",18)//条件查询

插入;

u := User{Name:"xxx", Age:18}//定义数据
db.Create(&u)//插入新数据

删除:

db.Delete(&cdt)//直接删除
db.Where("age > ?",20).Delete()//批量删除
db.Unscoped.Delete(&cdt)//物理删除

对于有DeleteAt字段的数据,在进行删除时会执行软删除,并不会直接删除数据库的数据,而会先设置删除时间

更新:

db.Model(&user).Update("name", "hello")// 更新单个属性,如果它有变化name=“hello”

db.Model(&user).Where("active = ?", true).Update("name", "hello")// 根据给定的条件更新单个属性name=“hello”

db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})// 使用 map 更新多个属性,只会更新其中有变化的属性

db.Model(&user).Updates(User{Name: "hello", Age: 18})// 使用 struct 更新多个属性,只会更新其中有变化且为非零值的字段
// 警告:当使用 struct 更新时,GORM只会更新那些非零值的字段

db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})//条件更新