Go frame simple(2) orm gorm

1 GORM简介

ORM: 映射数据库和对象之间的关系.
gorm:一个使用Go语言编写的ORM框架.

github地址有2个大的版本:
V1 https://github.com/jinzhu/gorm
V2 https://github.com/go-gorm/gorm

本章以V1版本为例进行说明。

2 GORM安装

Go get方式安装,输入命令:

go get -u github.com/jinzhu/gorm

go module方式引入依赖。

require github.com/jinzhu/gorm v1.9.16

3 GORM编程入门

这里以MySql为例进行入门。

数据库 db_test
表:tb_user
模型:User

3.1 modle与表关联

第1步:创建表的sql语句如下:


CREATE TABLE `tb_user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `user_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '系统用户名称',
  `user_password` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '系统用户密码',
  `role_id` int(255) DEFAULT NULL COMMENT '角色',
  `user_phone` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '手机号',
  `reg_time` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登记时间',
  `user_status` int(1) NOT NULL DEFAULT 0 COMMENT '状态(0:无效;1:有效)',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统管理员帐号' ROW_FORMAT = Dynamic;

第2步:创建User 结构体:

type User struct {
   Id           int64  `gorm:"primary_key"`
   UserName     string `gorm:"column:user_name"`
   UserPassword string `gorm:"column:user_password"`
   RoleId       int8   `gorm:"column:role_id"`
   UserPhone    string `gorm:"column:user_phone"`
   RegTime      string `gorm:"column:reg_time"`
   RoleStatus   int8   `gorm:"column:user_status"`
}

gorm 用 tag 的方式来标识 mysql 里面的约束,代码中定义模型(Models)与数据库中的数据表进行映射。

结构体标记(Tag) 描述

Column	指定列名
Type	指定列数据类型
Size	指定列大小, 默认值255
PRIMARY_KEY	将列指定为主键
UNIQUE	将列指定为唯一
DEFAULT	指定列默认值
...

第3步:指定表与User 结构体关联。

//通过给struct实体类定义TableName,返回绑定表名
func (u User) TableName() string {
   //绑定MYSQL表名为user
   return "tb_user"
}

3.2 CRUD操作

3.2.1 连接和关闭数据库

连接数据库代码如下:

func ConnectDb() {
   //配置MySQL连接参数
   username := "root"         //账号
   password := "123456" //密码
   host := "127.0.0.1" //数据库地址,可以是Ip或者域名
   port := 3306        //数据库端口
   dbname := "db_test" //数据库名
   //连接MYSQL
   dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, dbname)

   var err error
   db, err = gorm.Open("mysql", dsn)

   if err != nil {
      panic("数据库连接失败,error:" + err.Error())
   } else {
      fmt.Println("数据库连接成功:")
   }
}

关闭数据库代码如下:

func CloseDb() {
   fmt.Println("关闭数据库:")
   db.Close()
}

3.2.2 Create 插入用户

第1步:新增用户的代码如下:

func InsertUser() {
   fmt.Println("---------插入user begin---------")
   insertUser := User{
      Id:           1,
      UserName:     "令狐冲",
      UserPassword: "123456",
      UserPhone:    "666",
      RoleId:       1,
      RegTime:      "2021-12-3 00:00:00",
      RoleStatus:   1,
   }
   if err := db.Create(insertUser).Error; err != nil {
      fmt.Println("新增用户失败,err:", err)
   } else {
      fmt.Println("新增用户成功!")
   }
   fmt.Println("---------插入user end---------")
}

第2步:启动调用函数:

InsertUser()

第3步:运行结果日志:

---------插入user begin---------
新增用户成功!
---------插入user end---------

第4步:查看数据库:
在这里插入图片描述

3.2.3 Retrieve查询用户

查询所有用户:
第1步:主要代码:

func SelectUser() {
   fmt.Println("---------查询user begin---------")
   var users []User
   db.Find(&users)
   for _, user := range users {
      fmt.Println("用户:")
      fmt.Println("名称:", user.UserName)
      fmt.Println("手机号:", user.UserPhone)
      fmt.Println("注册时间:", user.RegTime)
   }
   fmt.Println("---------查询user end---------")
}


第2步:启动调用函数:

SelectUser()

第3步:数据库里有2条记录,运行结果:

---------查询user begin---------
用户:
名称: 令狐冲
手机号: 666
注册时间: 2021-12-3 00:00:00
用户:
名称: 任盈盈
手机号: 888
注册时间: 2021-12-03 00:00:00
---------查询user end---------

根据条件查询用户。
第1步:,这里根据用户名称查询。

func SelectUserByUserName(name string) {
   fmt.Println("---------查询user begin---------")
   var user = new(User)
   result := db.Where("user_name=?", name).First(&user)
   if result.Error != nil {
      fmt.Println("查询失败。")
   } else {
      fmt.Println("名称:", user.UserName)
      fmt.Println("手机号:", user.UserPhone)
      fmt.Println("注册时间:", user.RegTime)
   }
   fmt.Println("---------查询user end---------")
}

第2步:启动调用函数:

SelectUserByUserName("令狐冲")

第3步:运行结果日志:

---------查询user begin---------
名称: 令狐冲
手机号: 666
注册时间: 2021-12-3 00:00:00
---------查询user end---------

同样支持检索数量limt()、排序order()、计数count()等。

3.2.4 Update更新用户

提供对记录进行更新操作,
1 通过Map传递更新属性,
2通过struct传递更新属性
这里通过struct传递更新属性。

第1步:根据ID修改用户的代码如下:

func UpdateUser(id int64,  phone string) {
   fmt.Println("---------更新user begin---------")
   var user User
   if err:=db.Model(&user).Where("id=?", id).Update(phone ).Error ; err!=nil{
      fmt.Println("修改用户信息失败,err:", err)
   }else{
      fmt.Println("修改用户信息成功!")
   }

   fmt.Println("---------更新user end---------")
}

第2步:启动调用函数:

UpdateUser(1, "999")

第3步:运行结果日志:

---------更新user begin---------
修改用户信息成功!
---------更新user end---------

第4步:查看数据库:
在这里插入图片描述
可以看到用户电话已修改为999.。

同样,通过Updates可以修改多个属性。

3.2.45 Delete删除用户

第1步:删除用户的代码如下:

func DeleteUser(id int64) {
   fmt.Println("---------删除user begin---------")
   delUser := &User{
      Id: id,
   }
   if err := db.Delete(delUser).Error; err != nil {
      fmt.Println("删除用户失败,err:", err)
   } else {
      fmt.Println("删除用户成功!")
   }
   fmt.Println("---------删除user end---------")
}


第2步:启动调用函数:

DeleteUser(1)

第3步:运行结果日志:

---------删除user begin---------
删除用户成功!
---------删除user end---------

第4步:查看数据库:
Id为1的用户已经不存在了。

需要的话,可以熟悉事务、多表关联的代码。
代码:
https://gitee.com/linghufeixia/go-simple
chapter2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值