GoWeb - GORM
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相关推荐
- Gin+Gorm+sessions 搭建 golang web项目
Gin是用Go(Golang)编写的HTTP web框架.它具有类似Martini的API,但性能比Martini快40倍 Gorm,Golang 出色的ORM库 sessions,具有多后端支持的用 ...
- Grails GORM查询总结
GORM绝对是Grails框架的一大亮点.GORM基于Hibernate的ORM之上做二次封装,既有Hibernate强大的功能,又有使用简便的特点.本篇主要总结和类比在项目开发中用到的GORM查询方 ...
- Go 语言编程 — gormigrate GORM 的数据库迁移助手
目录 文章目录 目录 前言 gormigrate 核心结构体 实现分析 版本定义 InitSchema Migration 版本记录(历史) 版本升级和回退 前言 GORM v2 gormigrate ...
- Go 语言编程 — gorm 数据库版本迁移
目录 文章目录 目录 前言 AutoMigrate 示例 Migrator 接口(DDL 操作方法) 表操作 列操作 约束操作 索引操作 数据库版本控制 参考文档 前言 本文示例为 GORM V2.0 ...
- Go 语言编程 — gorm 的数据完整性约束
目录 文章目录 目录 前言 实体完整性(主键约束) 用户定义完整性(非空约束.唯一约束.检查约束和默认值) 参照完整性(外键约束) 关联关系 一对一.一对多关联 多对多关联 示例 前言 本文基于 Po ...
- Go 语言编程 — gorm ORM 框架
目录 文章目录 目录 实现一个关系型数据库应用程序需要做什么? GORM 连接数据库 表定义 Module Struct tags 表操作 db.HasTable 表是否存在 db.CreateTab ...
- gorm软删除_gorm踩坑:软删除与某个字段的唯一性
有一个user_infos表,用户名唯一.我在model定义user_name的时候已经使用gorm的tag标记为unique_index.类似如下: type UserInfo struct { I ...
- 使用gin和gorm框架完成的bubble小清单项目
bubble小项目 bubble小清单项目 1. 使用gin框架来做服务端,回应浏览器发送的请求 1.gin.Default() 启动一个默认的路由 1.前端页面需要加载静态文件 2.静态文件加载地址 ...
- gorm增删改查总结
gorm在创建表时使用CreateTable方法进行处理,其参数可以是结构体变量的地址形式,也可以是结构体的地址形式. 例如: var t Tecent db.CreateTable(&t)或 ...
最新文章
- CORS在Spring中的实现
- R语言一键批量完成差异统计和可视化
- Linux 下 SVN 添加多个文件的方法
- 万字综述,核心开发者全面解读PyTorch内部机制
- Shell入门教程:算术运算
- 通过appium-desktop定位元素
- “删库跑路”重现江湖,技术和制度如何保障数据安全?
- JAVA就诊叫号_基于B/S的JAVA门诊就诊系统
- 安装和启动mysql
- sql server 查询工具_分享一款开源的SQL查询优化工具--EverSQL
- Spring MVC--@RequestMapping
- 他山之石 可以攻玉-《海量数据库解决方案》
- FFmpeg 转码压缩
- 内存碎片产生原因及解决方法
- phaser H5游戏框架的学习相关推荐教程
- java毕业设计——基于java+java-swing的泡泡堂网络游戏设计与实现(毕业论文+程序源码)——泡泡堂网络游戏
- 完美日记母公司逸仙电商将收购护肤品牌Eve Lom
- Transphorm的表面贴装封装产品系列增加行业标准TO-263 (D2PAK)封装产品,扩大SuperGaN平台的优势
- uniapp px转rpx
- 空白脂质体冻干粉制备以及荧光素修饰空白脂质体的应用
热门文章
- 前端开发的发展方向都有哪些?职业方向定位?
- Remix连接本地项目(Solidity)
- DECIMAL (6,2)
- 人工智能画画 yyds
- #第一章 从数学拟合的角度看股市理论的预测环节--一、恼人的数学题
- 【FCC】Build a Tribute Page(html+css+bootstrap)
- 通达+oa+php+文件+乱,通达OA 任意文件上传+文件包含导致RCE
- 英语----非谓语的另类运用:独立主格
- Jetson TX2 刷机中遇到的奇葩大坑
- 中醫秘笈大公開---家家必備十良方