前言
本文主要内容为Go语言ORM框架GORM的介绍与基础使用。
什么是ORM
ORM全称为对象关系映射(Object-Relational Mapping),用于将对象模型与关系型数据库之间的数据进行映射与转换,从而减少了编写与维护原生SQL语句的工作。它允许开发者在编程中使用面向对象的方式操作数据库,更加优雅。
常见的ORM框架
- Hibernate (Java): Hibernate 是 Java 社区中最著名的 ORM 框架之一。它允许 Java 开发者以面向对象的方式操作数据库,自动生成 SQL 查询和映射关系。Hibernate 在 Java EE 和 Spring 等框架中得到广泛应用。
- Django ORM (Python): Django 是 Python 中的一个流行 Web 框架,它自带了一个强大的 ORM 框架。Django ORM 提供了高级的查询、模型关系和事务管理功能。
- equelize (Node.js): Sequelize 是 Node.js 平台上的 ORM 框架。它支持多种数据库,提供了高级的查询和模型定义功能,使得 Node.js 开发者可以更方便地操作数据库。
Gorm
Golang语言中一款性能极好的ORM库,对开发人员相对是比较友好的。支持MySQL、PostgreSQL、SQLite 等数据库。
快速入门
安装
安装gorm框架与mysql数据库驱动
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
连接数据库并配置信息
func Init(cfg *settings.MySQLConfig) (err error) {
//连接信息
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
cfg.User,
cfg.Password,
cfg.Host,
cfg.Port,
cfg.DBName,
)
//配置信息
mysqlConfig := gorm.Config{
SkipDefaultTransaction: false,
//这里可以添加这个gorm的logger
//Logger: ,
}
//开始连接
db, err = gorm.Open(mysql.Open(dsn), &mysqlConfig)
if err != nil {
zap.L().Error("mysql init errr", zap.Error(err))
panic("warn err!")
}
//建表
initMigrate()
return
}
关于数据库参数dsn:
- cfg.User:登录数据库服务器的用户名。
- cfg.Password”登录数据库服务器的密码。
- cfg.Host:数据库服务器的 IP 地址,这里是本地地址。
- cfg.Port:数据库服务器的端口号。
- cfg.DBName:要连接的数据库的名称。
- charset=utf8mb4:指定了数据库编码为 utf8mb4,这样可以支持存储中文。
- parseTime=True:指定了在连接中解析时间类型。
- loc=Local:指定了时区。
关于MysqlConfig中可以自定义的设置:
- SkipDefaultTransaction:是否跳过默认的事务处理,默认为否。
- NamingStrategy:数据库表和列的命名策略,在默认情况下,GORM 会将模型名称转换为复数形式来映射到数据库中的表名。
- FullSaveAssociations:是否完全保存关联。
- Logger:自定义日志记录器。
- NowFunc:自定义“当前时间”函数。
- DryRun:是否生成 SQL 语句但不执行。
- PrepareStmt:是否在缓存语句中执行给定的查询。
- DisableAutomaticPing:是否禁用自动 ping。
- DisableForeignKeyConstraintWhenMigrating:是否在迁移时禁用外键约束。
- IgnoreRelationshipsWhenMigrating:是否忽略迁移中的关系。
- DisableNestedTransaction:是否禁用嵌套事务。
- AllowGlobalUpdate:是否允许全局更新。
- QueryFields:是否在查询中使用表的所有字段。
- CreateBatchSize:默认的批量创建大小。
- ClauseBuilders:条件生成器。
- ConnPool:数据库连接池。
- Dialector:数据库方言。
- Plugins:已注册的插件。
创建模型
定义模型结构体
type UserInfo struct {
gorm.Model // 如果需要使用 GORM 提供的内置模型字段(如 ID、CreatedAt、UpdatedAt、DeletedAt),可以嵌入 gorm.Model 结构体
ID uint
Name string
Gender string
Hobby string
}
其中 gorm:"column:first_name"
标签指定了字段在数据库中的列名,使用 gorm:"unique"
标签指定了 Email 字段在数据库中是唯一的,也可以使用gorm: "primary_key"
自定义主键。
创建数据库表
// 自动迁移,根据模型定义创建数据库表
db.AutoMigrate(&User{})
插入数据
u1 := UserInfo{Name:"小明",Gender:"男",Hobby:"篮球"}
u2 := UserInfo{Name:"xxn",Gender:"女",Hobby:"写作"}
db.Create(&u1)
db.Create(&u2)
查询数据
db.Find(u)`
log.Printf(``"%v\n"``, u)`
var u3 = new(UserInfo)`
db.First(u3)`
log.Printf(``"%v\n"``, u3)`
u4 := &UserInfo{}`
db.Find(u, "name=?", "xxn")`
log.Printf("%v\n", u4)`
修改数据
u5 := &UserInfo{}`
db.Model(u5).Where("name=?", "小明").Update("hobby"``, "读书")
删除数据
db.Delete(&UserInfo{})