【Go】Go Gorm 详解

打印 上一主题 下一主题

主题 856|帖子 856|积分 2568

1. 概念

   Gorm 官网:https://gorm.io/zh_CN/docs/
  Gorm:The fantastic ORM library for Golang aims to be developer friendly,这是官网的先容,简单来说 Gorm 就是一款高性能的 Golang ORM 库,便于开辟人员提高效率
那么 ORM(Object Relation Mapping) 又是什么呢?在 Golang 语言中,Object指的就是 struct 结构体对象,Relation 就是数据库当中的关系,Mapping则表示两者具有映射关系,具体表现如下:


  • Go当中的结构体声明 <-> 数据库层面的表结构
  • Go当中的结构体实例 <-> 数据库层面的一条表记载
2. 数据库毗连

2.1 安装依赖

想要在 Go 代码中使用 gorm 我们需要先引入对应的依赖:


  • gorm 库依赖:gorm.io/gorm
  • 特定数据库驱动依赖:gorm.io/driver/mysql
然后使用 go mod 包管理工具加载对应的依赖:

  • go mod init first_gorm:初始化

  • go mod tidy:加载依赖

然后就可以开始编写代码了!
2.2 毗连数据库

在操作数据库之前,我们还需要与指定的数据库建立毗连,此处以 MySQL数据库为例:
基本语法:db, err := gorm.Open(mysql.Open(dsn语句), &gorm.Config{})


  • 其中 dsn 语句为特定的毗连格式,形式如下:user:pwd@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local
  1. package main
  2. import (
  3.         "fmt"
  4.         "gorm.io/driver/mysql"
  5.         "gorm.io/gorm"
  6. )
  7. func main() {
  8.         var dsn = "root:QWEzxc123456@tcp(127.0.0.1:3306)/gorm_test?charset=utf8mb4&parseTime=True&loc=Local"
  9.         db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  10.         if err != nil {
  11.                 fmt.Println("数据库连接失败!", err)
  12.         }
  13.         fmt.Println(db)
  14. }
复制代码
程序运行效果:

控制台打印出 db 对象,阐明我们已经成功与数据库建立毗连(必须包管数据库中存在指定的数据库)
3. 数据库基本操作

3.1 创建表(表关系映射)

3.1.1 基本使用

我们可以使用 gorm 提供的 API 来创建指定的表,需要关注的是 结构体声明 <=> 数据库表结构,因此我们想要创建一个表结构实则只需要界说一个结构体类型
  1. -- 创建user表 --
  2. create table t_user (
  3.   user_id bigint primary key auto_increment,
  4.   user_name varchar(32) not null,
  5.   user_pwd varchar(128) not null,
  6.   user_phone varchar(32) unique
  7. )
复制代码
使用上述 SQL 语句创建表的行为等价于在 Go 语言当中界说下列结构体对象:
  1. // User 结构体声明
  2. type User struct {
  3.         UserId    int64  `gorm:"primaryKey;autoIncrement"`
  4.         UserName  string `gorm:"not null;type:varchar(32)"`
  5.         UserPwd   string `gorm:"not null;type:varchar(128)"`
  6.         UserPhone string `gorm:"unique;type:varchar(32)"`
  7. }
复制代码
创建表基本语法:err := db.AutoMigrate(&特定结构体{})
  1. package main
  2. import (
  3.     "fmt"
  4.     "gorm.io/driver/mysql"
  5.     "gorm.io/gorm"
  6. )
  7. // User 结构体声明
  8. type User struct {
  9.     UserId    int64  `gorm:"primaryKey;autoIncrement"`
  10.     UserName  string `gorm:"not null;type:varchar(32)"`
  11.     UserPwd   string `gorm:"not null;type:varchar(128)"`
  12.     UserPhone string `gorm:"unique;type:varchar(32)"`
  13. }
  14. func main() {
  15.     // 连接数据库
  16.     var dsn = "root:QWEzxc123456@tcp(127.0.0.1:3306)/gorm_test?charset=utf8mb4&parseTime=True&loc=Local"
  17.     db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  18.     if err != nil {
  19.         fmt.Println("数据库连接失败!", err)
  20.     }
  21.     err = db.AutoMigrate(&User{})
  22.     if err != nil {
  23.         fmt.Println("数据库表迁移失败!", err)
  24.     }
  25. }
复制代码
程序运行效果:

3.1.2 自界说表名

我们发现界说结构体名称为 “User” 时会创建 “users” 的表名,但是假如我就盼望叫做 “t_user” 应该怎么办呢?我们可以界说一个名为 TableName的方法接收器,格式如下:
  1. func (*User) TableName() string {
  2.         return "t_user"
  3. }
复制代码
删除原先的表后再次运行,可以发现此时表名称已经指定为t_user了
3.2 新增记载

我们还可以使用 gorm 提供的 API 进行表记载的插入,这里我们需要关注** 结构体实例 <=> 表记载** 之间的映射关系,也就意味着我们可以通过创建一个结构体实例,实现插入一条记载的效果
3.2.1 单条数据插入

基本语法:db.Create(&结构体实例)
  1. package mainimport (        "fmt"        "gorm.io/driver/mysql"        "gorm.io/gorm")// User 结构体声明
  2. type User struct {
  3.         UserId    int64  `gorm:"primaryKey;autoIncrement"`
  4.         UserName  string `gorm:"not null;type:varchar(32)"`
  5.         UserPwd   string `gorm:"not null;type:varchar(128)"`
  6.         UserPhone string `gorm:"unique;type:varchar(32)"`
  7. }
  8. func (*User) TableName() string {
  9.         return "t_user"
  10. }
  11. func main() {        // 毗连数据库        var dsn = "root:QWEzxc123456@tcp(127.0.0.1:3306)/gorm_test?charset=utf8mb4&parseTime=True&loc=Local"        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})        if err != nil {                fmt.Println("数据库毗连失败!", err)        }        // 插入单条数据        var user = User{UserName: "wjj", UserPwd: "123", UserPhone: "111"}        db.Create(&user)        // 再次打印user        fmt.Println(user)}
复制代码
数据库表效果:

程序运行效果:

   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

反转基因福娃

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表