gorm基本使用

前言

在开发过程中,程序员最牛杯的技能就是对数据库的CRUD操作,那在操作数据库的过程中,程序员需要知道哪些事情?

  • 数据库链接
  • sql语句
  • 新增(Create)、读取(Read)、更新(Update)、删除数据(Delete)
  • ORM(Object Relational Mapping),对象关系映射,指将数据库表的结构与对象数据结构进行自动映射

在Java web 中,有mybatiesmybaties plusspring boot jpahibernate等优秀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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容