这是我参与「第五届青训营 」伴学笔记创作活动的第 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})//条件更新