前言
在开发过程中,程序员最牛杯
的技能就是对数据库的CRUD操作,那在操作数据库的过程中,程序员需要知道哪些事情?
- 数据库链接
- sql语句
- 新增(Create)、读取(Read)、更新(Update)、删除数据(Delete)
- ORM(Object Relational Mapping),对象关系映射,指将数据库表的结构与对象数据结构进行自动映射
在Java web 中,有mybaties
、mybaties plus
、spring boot jpa
、hibernate
等优秀ORM框架,在开发过程中简化我们的数据库操作代码,专注业务代码开发,提高开发效率。
在go项目开发中,有类似这样的ORM框架吗?gorm
就是go语言的一个ORM框架。
gorm 使用
本节将了解gorm的基本使用:
- gorm 安装
- gorm 数据库链接
- gorm crud操作
- gorm orm 基本映射
gorm 安装
# gorm
go get -u gorm.io/gorm
# gorm mysql数据库链接驱动
go get -u gorm.io/driver/mysql
创建数据库链接
dns := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dns), &gorm.Config{})
if err != nil {
logrus.Fatalln("初始化mysql数据库连接错误。%v", err)
}
CRUD
mport (
"errors"
"gorm.io/gorm"
"org.chatgin/internal/config"
)
// 结构体必须依赖 gorm.Model
type UserBasic struct {
gorm.Model
Account string //账号
Username string // 用户明
Passwrod string // 登录密码
State int16 // 用户状态, -1 - 异常;0 - 锁定;1 - 正常;
}
type UserRepository struct {
}
// 初始化表结构,如果存在则不创建
func InitTables() {
// 如果表不存在则自动创建表
config.MysqlDB.AutoMigrate(&repository.UserBasic{})
}
// 根据用户名获取用户信息
func (u *UserRepository) GetByUsername(account string) (user UserBasic, err error) {
var userBasci UserBasic
if err := config.MysqlDB.Where("account = ? ", account).First(userBasci).Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return userBasci, err
}
return userBasci, nil
}
// 新增数据
func (u *UserRepository) Create(user UserBasic) error {
if err := config.MysqlDB.Create(user).Error; err != nil {
return err
}
return nil
}
// 修改用户数据
func (u *UserRepository) Updates(user UserBasic) error {
config.MysqlDB.Model(&user).Updates(&user)
return nil
}
// 删除数据
func (u *UserRepository) Delete(id uint) error {
var user UserBasic
config.MysqlDB.Delete(&user, id)
return nil
}
注:上面代码中的config.MysqlDB是我自己定义的数据库链接对象,以后会持续分享
分析
gorm 如何实现orm的呢?我们来看看 gorm.Model
的源码:
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
然后,我们看看它自动创建的表结构是怎样的:
mysql> desc user_basics;
+------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| created_at | datetime(3) | YES | | NULL | |
| updated_at | datetime(3) | YES | | NULL | |
| deleted_at | datetime(3) | YES | MUL | NULL | |
| account | longtext | YES | | NULL | |
| username | longtext | YES | | NULL | |
| passwrod | longtext | YES | | NULL | |
| state | smallint(6) | YES | | NULL | |
+------------+---------------------+------+-----+---------+----------------+
通过观察,表字段与go 的struts字段的对应关系是,表字段多单词通过_
分割
- gorm 默认根据数据库字段命名规则与struts 的命名规则,通过反射进行映射关系。比如:CreatedAt 这个字段生成的数据库字段是 created_at
- gorm 也可以通过 gorm:"column:数据库字段"进行显示映射
- ...
总结
gorm 还有很多特性,比如数据权限、事物、hook 等,大家可以自行查阅官方文档(推介):
https://gorm.io/docs/models.html