安装
go get -u gorm.io/gorm
连接到数据库
GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
以连接mysql为例。
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{})
sqlDB, err := db.DB()
defer sqlDB.Close()
}
关于dsn:
- user -> 用户名
- pass -> 密码
- 127.0.0.1 -> mysql默认本地地址,也就是localhost
- 3306 -> mysql默认端口
- dbname -> 数据库名称
- charset -> 字符集编码
- parseTime -> 把数据库datetime和date类型转换为golang的time.Time类型
- loc -> 使用系统本地时区
使用 db.DB() 方法,我们获取了底层的 *sql.DB 对象 sqlDB。在 GORM 中,db.DB() 用于返回 *sql.DB 对象,它是底层数据库操作的核心对象。
声明模型
type Video struct {
VideoId int64 `gorm:"primaryKey"`
UserId int64
PlayUrl string
CoverUrl string
FavoriteCount int64
CommentCount int64
Title string
CreateAt time.Time
UpdateAt *time.Time
DeleteAt *time.Time
}
GORM 倾向于约定优于配置 默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间。
例如:上述代码gorm会将其映射为
CREATE TABLE `video` (
`video_id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint DEFAULT NULL,
`play_url` varchar(255) DEFAULT NULL,
`cover_url` varchar(255) DEFAULT NULL,
`favorite_count` bigint DEFAULT NULL,
`comment_count` bigint DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
`create_at` datetime DEFAULT NULL,
`update_at` datetime DEFAULT NULL,
`delete_at` datetime DEFAULT NULL,
PRIMARY KEY (`video_id`)
)
而结构体中以小字母开头的字段则不会出现。
自定义生成的表结构
- 表名 :实现Tabler接口中的TableName函数。
- 字段名以及数据类型:字段后面打上gorm tag。
tag有很多用途,比如标记主键,指定not null等等,具体可以看官方文档。
创建表
GORM 的 AutoMigrate() 方法用于自动迁移 ORM 的 Schemas。所谓 “迁移” 就是刷新数据库中的表格定义,使其保持最新(只增不减)。
AutoMigrate 会创建(新的)表、缺少的外键、约束、列和索引,并且会更改现有列的类型(如果其大小、精度、是否为空可更改的话)。但不会删除未使用的列,以保护现存的数据。
db.AutoMigrate(&Video{})
创建记录
Video := Video{
Name: Videoname,
Password: password,
FollowingCount: 0,
FollowerCount: 0,
CreateAt: time.Now(),
}
result := db.Create(&video)
查找记录
var videos []*Video
err := db.Where("user_id = ?", userId).Find(&videos).Error
更新记录
err := db.Model(&Video{}).Where("video_id=?", videoId).Update("comment_count", gorm.Expr("comment_count+?", cnt)).Error
删除记录
删除一条记录时,删除对象需要指定主键,否则会触发批量删除。例如:
db.Where("video_id = ?", videoId).Delete(&Video)
上述代码指定对vide_id =videId的记录进行删除。
GORM的作用:
- 简化数据库操作: GORM 提供了一种更直观和简单的方式来执行数据库操作,使开发人员可以使用面向对象的语法,而不需要编写大量的 SQL 查询语句。
- 提高开发效率: 使用 GORM 可以减少手动编写 SQL 查询和处理数据库连接的工作量,从而提高开发效率。
- 避免 SQL 注入: GORM 会自动将参数化查询应用到 SQL 查询中,从而减少 SQL 注入的风险。
- 数据库无关性: GORM 支持多种数据库,包括 MySQL、PostgreSQL、SQLite 等,使得应用程序在不同数据库之间切换更加容易。
- 模型定义: GORM 允许你通过结构体定义数据模型,从而将数据库表映射到 Go 的结构体上。
参考
Gorm官方文档: GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.