GORM

GORM : Object Relational Mapping

对象:程序中的对象、实例,如结构体

关系:关系数据库,例如MySQL

数据表;结构体

数据行:结构体实例

字段:结构体字段

ORM的优点在于提高开发效率

缺点:牺牲执行能力,牺牲灵活性以及弱化SQL能力

11.1 在本地或远程启动并连接数据库

11.1.1 启动服务器和Docker

ssh root@xxxsystemctl start docker //启动docker

11.1.2 使用容器启动MySQL

docker run -d -p 80:80 docker/getting-started //启动docker
docker run --name mysql -e MYSQL_ROOT_PASSWORD=xxx, -p 3301:3306  -d mysql //启动容器
docker exec -it 8b4545118c60  /bin/bash //进入容器
mysql -u root -p //mysql -u root -p
Enter password:  //输入密码则会看到连接成功
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 8.0.28 MySQL Community Server - GPLCopyright (c) 2000, 2022, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>

11.1.3 数据库操作

CREATE DATABASE db1; //创建数据库
show databases; //查看看数据库是否创建成功
use db1; //使用数据库
show tables;//查看数据库中的数据表

11.2 使用GORM连接数据库

import ("github.com/jinzhu/gorm"                  //引入gorm_ "github.com/jinzhu/gorm/dialects/mysql" //匿名引入mysql驱动,不直接使用,而是使用其内部一些初始化函数
)//定义一个结构体(在数据库中对应一个表)type UserInfo struct {ID     intName   stringGender stringHobby  string
}func main() {//连接数据库//注意书写用户名、密码、主机名称、端口号以及数据库名称db, err := gorm.Open("mysql", "root:xxx@tcp(xxx:3301)/db1?charset=utf8mb4&parseTime=True&loc=Local")if err != nil {panic(err)}//操作完之后记得关闭defer db.Close()//创建表 自动迁移(把结构体和数据表进行对应)db.AutoMigrate(&UserInfo{})//创建数据行,增加数据u1 := UserInfo{ID: 1, Name: "shi", Gender: "male", Hobby: "swimming"}db.Create(&u1)
}
mysql> show tables; //查看表是否已经创建
mysql> desc user_infos; //查看表结构
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | int          | NO   | PRI | NULL    | auto_increment |
| name   | varchar(255) | YES  |     | NULL    |                |
| gender | varchar(255) | YES  |     | NULL    |                |
| hobby  | varchar(255) | YES  |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+
mysql> select * from user_infos; //查看main函数中创建好的信息
+----+------+--------+----------+
| id | name | gender | hobby    |
+----+------+--------+----------+
|  1 | shi  | male   | swimming |
+----+------+--------+----------+

查询数据

var u UserInfodb.First(&u)fmt.Printf("u:%#v\n", u)
u:main.UserInfo{ID:1, Name:"shi", Gender:"male", Hobby:"swimming"}

更新和删除

//更新,将爱好信息变更db.Model(&u).Update("hobby","running")//删除db.Delete(&u)
mysql> select * from user_infos; //更新结果
+----+------+--------+---------+
| id | name | gender | hobby   |
+----+------+--------+---------+
|  1 | shi  | male   | running |
+----+------+--------+---------+mysql> select * from user_infos; //删除结果
Empty set (0.00 sec)

11.3 GORM模型定义

定义模型,以后所有操作就只针对于这个模型

type User struct {gorm.Model   //匿名结构体,继承gorm.ModelName         stringAge          sql.NullInt64BirthDate    *time.TimeEmail        string  `gorm:"type:varchar(100);unique_index"`Role         string  `gorm:"size:255"`        //设置字段大小为255MemberNumber *string `gorm:"unique;not null"` //设置会员号,唯一并且不为空Num          int     `gorm:"AUTO_INCREMENT"`  //设置自增长Address      string  `gorm:index:"addr"`      //给Address字段设置addr索引IgnoreMe     int     `gorm:"-"`               //忽略该字段
}

创建表

func main() {//连接数据库//注意书写用户名、密码、主机名称、端口号以及数据库名称db, err := gorm.Open("mysql", "root:15willis,@tcp(shiyivei.com:3301)/db1?charset=utf8mb4&parseTime=True&loc=Local")if err != nil {panic(err)}//操作完之后记得关闭defer db.Close()//创建表db.AutoMigrate(&User{})
}

查看表结构,前四个是内嵌结构体的字段

mysql> desc users;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int unsigned | NO   | PRI | NULL    | auto_increment |
| created_at    | datetime     | YES  |     | NULL    |                |
| updated_at    | datetime     | YES  |     | NULL    |                |
| deleted_at    | datetime     | YES  | MUL | NULL    |                |
| name          | varchar(255) | YES  |     | NULL    |                |
| age           | bigint       | YES  |     | NULL    |                |
| birth_date    | datetime     | YES  |     | NULL    |                |
| email         | varchar(100) | YES  | UNI | NULL    |                |
| role          | varchar(255) | YES  |     | NULL    |                |
| member_number | varchar(255) | NO   | UNI | NULL    |                |
| num           | int          | YES  |     | NULL    |                |
| address       | varchar(255) | YES  |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

GORM中主键、表名和列名的约定

ID作为主键,若无则使用tag指定

表明默认为结构体小些的复数,可以修改

type Animal struct {AnimalID int64 `gorm:"primary_key"`Name string Age int64
}
mysql> desc animals;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| animal_id | bigint       | NO   | PRI | NULL    | auto_increment |
| name      | varchar(255) | YES  |     | NULL    |                |
| age       | bigint       | YES  |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+
db.Table("xiaodongwu").CreateTable(&User{}) //指定表名称

列名也是可以更改的

11.4 创建记录

package mainimport ("fmt""github.com/jinzhu/gorm"                  //引入gorm_ "github.com/jinzhu/gorm/dialects/mysql" //匿名引入mysql驱动,不直接使用,而是使用其内部一些初始化函数
)type User struct {ID   int64Name *string `gorm:"default:'xiaowangzi'"` //默认值,如过传入空值可以使用指针Age  int64
}func main() {//1.连接数据库db, err := gorm.Open("mysql", "root:15willis,@tcp(shiyivei.com:3301)/db1?charset=utf8mb4&parseTime=True&loc=Local")if err != nil {panic(err)}defer db.Close()//2.把模型与数据库中的表对应起来db.AutoMigrate(&User{})//show create table users; 查看表的创建语句//3.创建数据user := User{Name: new(string), Age: 48}fmt.Println(db.NewRecord(&user)) //判断主键是否为空db.Create(&user)fmt.Println(db.NewRecord(&user)) //判断主键是否为空
}

11.5 查询操作

type User struct {gorm.ModelName stringAge  int64
}func main() {//1.连接数据库db, err := gorm.Open("mysql", "root:15willis,@tcp(shiyivei.com:3301)/db1?charset=utf8mb4&parseTime=True&loc=Local")if err != nil {panic(err)}defer db.Close()//2.把模型与数据库中的表对应起来db.AutoMigrate(&User{})//show create table users; 查看表的创建语句//3.创建数据//user1 := User{Name: "shiyivei", Age: 17}//db.Create(&user1)////user2 := User{Name: "jinzhu", Age: 27}//db.Create(&user2)//4.查询数据// var user User// db.First(&user) //查询第一条数据// fmt.Printf("%#v\n", user)var users []Userdb.Find(&users) //查询所有数据fmt.Printf("%#v\n", users)
}

更多关于查询的操作可以参考官方文档

11.6 更新

//5.更新user.Name = "yivei"user.Age = 27db.Save(&user) //更新数据db.Model(&user).Update("name", "xiaowangzi") //更新数据

更多关于查询的操作可以参考官方文档

11.7 删除

gorm默认软删除

//6.删除user.ID = 1db.Debug().Delete(&user) //删除数据
select * from users;
+----+------------+------+---------------------+---------------------+---------------------+
| id | name       | age  | created_at          | updated_at          | deleted_at          |
+----+------------+------+---------------------+---------------------+---------------------+
|  1 | xiaowangzi |   27 | NULL                | 2022-05-18 14:19:57 | 2022-05-18 14:19:57 |
|  2 | xiaowangzi |   27 | 2022-05-18 13:29:26 | 2022-05-18 14:21:52 | NULL                |
|  3 | jinzhu     |   27 | 2022-05-18 13:29:26 | 2022-05-18 13:29:26 | NULL                |
+----+------------+------+---------------------+---------------------+---------------------+

注意:当主键为0时,会删除所有数据

更多关于查询的操作可以参考官方文档

GoWeb - GORM相关推荐

  1. Gin+Gorm+sessions 搭建 golang web项目

    Gin是用Go(Golang)编写的HTTP web框架.它具有类似Martini的API,但性能比Martini快40倍 Gorm,Golang 出色的ORM库 sessions,具有多后端支持的用 ...

  2. Grails GORM查询总结

    GORM绝对是Grails框架的一大亮点.GORM基于Hibernate的ORM之上做二次封装,既有Hibernate强大的功能,又有使用简便的特点.本篇主要总结和类比在项目开发中用到的GORM查询方 ...

  3. Go 语言编程 — gormigrate GORM 的数据库迁移助手

    目录 文章目录 目录 前言 gormigrate 核心结构体 实现分析 版本定义 InitSchema Migration 版本记录(历史) 版本升级和回退 前言 GORM v2 gormigrate ...

  4. Go 语言编程 — gorm 数据库版本迁移

    目录 文章目录 目录 前言 AutoMigrate 示例 Migrator 接口(DDL 操作方法) 表操作 列操作 约束操作 索引操作 数据库版本控制 参考文档 前言 本文示例为 GORM V2.0 ...

  5. Go 语言编程 — gorm 的数据完整性约束

    目录 文章目录 目录 前言 实体完整性(主键约束) 用户定义完整性(非空约束.唯一约束.检查约束和默认值) 参照完整性(外键约束) 关联关系 一对一.一对多关联 多对多关联 示例 前言 本文基于 Po ...

  6. Go 语言编程 — gorm ORM 框架

    目录 文章目录 目录 实现一个关系型数据库应用程序需要做什么? GORM 连接数据库 表定义 Module Struct tags 表操作 db.HasTable 表是否存在 db.CreateTab ...

  7. gorm软删除_gorm踩坑:软删除与某个字段的唯一性

    有一个user_infos表,用户名唯一.我在model定义user_name的时候已经使用gorm的tag标记为unique_index.类似如下: type UserInfo struct { I ...

  8. 使用gin和gorm框架完成的bubble小清单项目

    bubble小项目 bubble小清单项目 1. 使用gin框架来做服务端,回应浏览器发送的请求 1.gin.Default() 启动一个默认的路由 1.前端页面需要加载静态文件 2.静态文件加载地址 ...

  9. gorm增删改查总结

    gorm在创建表时使用CreateTable方法进行处理,其参数可以是结构体变量的地址形式,也可以是结构体的地址形式. 例如: var t Tecent db.CreateTable(&t)或 ...

最新文章

  1. CORS在Spring中的实现
  2. R语言一键批量完成差异统计和可视化
  3. Linux 下 SVN 添加多个文件的方法
  4. 万字综述,核心开发者全面解读PyTorch内部机制
  5. Shell入门教程:算术运算
  6. 通过appium-desktop定位元素
  7. “删库跑路”重现江湖,技术和制度如何保障数据安全?
  8. JAVA就诊叫号_基于B/S的JAVA门诊就诊系统
  9. 安装和启动mysql
  10. sql server 查询工具_分享一款开源的SQL查询优化工具--EverSQL
  11. Spring MVC--@RequestMapping
  12. 他山之石 可以攻玉-《海量数据库解决方案》
  13. FFmpeg 转码压缩
  14. 内存碎片产生原因及解决方法
  15. phaser H5游戏框架的学习相关推荐教程
  16. java毕业设计——基于java+java-swing的泡泡堂网络游戏设计与实现(毕业论文+程序源码)——泡泡堂网络游戏
  17. 完美日记母公司逸仙电商将收购护肤品牌Eve Lom
  18. Transphorm的表面贴装封装产品系列增加行业标准TO-263 (D2PAK)封装产品,扩大SuperGaN平台的优势
  19. uniapp px转rpx
  20. 空白脂质体冻干粉制备以及荧光素修饰空白脂质体的应用

热门文章

  1. 前端开发的发展方向都有哪些?职业方向定位?
  2. Remix连接本地项目(Solidity)
  3. DECIMAL (6,2)
  4. 人工智能画画 yyds
  5. #第一章 从数学拟合的角度看股市理论的预测环节--一、恼人的数学题
  6. 【FCC】Build a Tribute Page(html+css+bootstrap)
  7. 通达+oa+php+文件+乱,通达OA 任意文件上传+文件包含导致RCE
  8. 英语----非谓语的另类运用:独立主格
  9. Jetson TX2 刷机中遇到的奇葩大坑
  10. 中醫秘笈大公開---家家必備十良方