前言
本文是使用go的orm库:GORM 来连接mysql数据库(8.0版本) 并进行增删查改操作的文章。其中会涉及到 mysql远程登录设置 orm的依赖下载 orm的使用 三部分。
gorm介绍
Golang 出色且旨在对开发人员友好的 ORM 库
特性
- 全功能 ORM
- 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
- Create,Save,Update,Delete,Find 中钩子方法
- 支持
Preload、Joins的预加载 - 事务,嵌套事务,Save Point,Rollback To Saved Point
- Context、预编译模式、DryRun 模式
- 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
- SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
- 复合主键,索引,约束
- Auto Migration
- 自定义 Logger
- 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
- 每个特性都经过了测试的重重考验
- 开发者友好
mysql远程登录开启
登录mysql服务器
mysql -u root -p
查看当前mysql远程访问权限
use mysql
select User,authentication_string,Host from user;
如果在user为root的那一行看到host为localhost的话就需要进行修改
修改有两种方法
直接改表
update user set host='%' where user='root';
这样简单粗暴 如果使用grant命令修改失败的话可以使用这个方法
使用grant命令进行授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
使用grant命令进行授权后还需要进行权限的刷新 即 FLUSH PRIVILEGES;
实现了远程访问权限后就可以放心进行数据库的连接了
安装gorm
安装gorm先需要确定连接的是哪个数据库 本文章以 mysql 为例
不同的数据库需要下载不同的 数据库连接驱动 来进行对应数据库的连接
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
如果是想连接别的数据库的话需要修改 go get -u gorm.io/driver/mysql 中的 mysql 部分
例如 sqlite 的驱动下载就是 go get -u gorm.io/driver/sqlite
使用gorm
连接数据库
在使用gorm对数据库进行增删查改前 需要先连接好数据库
对于 mysql 来说 连接url就是以下这个模板
user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local
其中要修改的有五处 分别是
- 数据库账户名称 对应 user 字符串
- 数据库账户密码 对应 pass 字符串
- 连接url(本人是直接用的本地的 就可以用 127.0.0.1 或是 localhost )
- 连接url对应的数据库端口(默认为3306)
- 要连接的数据库名称 对应 dbname 字符串
例子
root:123456@tcp(127.0.0.1:3306)/test01?charset=utf8mb4&parseTime=True&loc=Local
其中 root 是账户名 、123456为密码、127.0.0.1是数据库服务器所在url、3306就是数据库端口、test01是连接的数据库
这里再提一嘴 为了对应 charset=utf8mb4 这个编码
在创建数据库以及其下数据表时 请将对应编码设置为 utf8mb4 编码
utf8mb4 编码对中文的支持性比较好
以下是较为完整的main函数内容
dsn := "root:123456@tcp(127.0.0.1:3306)/test01?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
println("连接失败")
println(err)
} else {
println("连接成功")}
这样一来就算是将连接部分完成了
创建数据表对应模型
gorm的操作其实就是通过对应的模型将对应的数据表进行映射操作
例如以下是我 users 表的 mysql 结构
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| username | varchar(50) | YES | | NULL | |
| email | varchar(100) | YES | | NULL | |
| phone | varchar(15) | YES | | NULL | |
| password | varchar(255) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
那么对应的模型可以是
type User struct {
ID uint
Username string
Phone string
Password string
Email string
}
有的时候也可以写 gorm 注释来更明确表示模型
查询数据
在创建模型后可以创建对应的变量 然后进行第一行数据的获取(默认第一行排序是根据主键升序的)
user := &User{}
db.First(&user)
fmt.Println("ID:", user.ID)
fmt.Println("Username:", user.Username)
fmt.Println("Phone:", user.Phone)
fmt.Println("Password:", user.Password)
fmt.Println("Email:", user.Email)
// 输出受影响的行数(这里其实一般是1,表示查询到一条数据)
fmt.Println("受影响的行数:", strconv.Itoa(int(res.RowsAffected)))
除了first以外还有其他的查询方法以及获取数据的方法
查询 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
高级查询 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
创建数据
在创建数据时也需要依赖模型
我们可以先在go中创建一个有数据的变量 然后将这个模型变量对数据表进行对应数据的新增
add_user := User{Username: "test02", Email: "test02@gmail.com", Password: "123456", Phone: "123456"}
db.Create(&add_user)
fmt.Println("ID:", add_user.ID)
fmt.Println("Username:", add_user.Username)
fmt.Println("Phone:", add_user.Phone)
fmt.Println("Password:", add_user.Password)
fmt.Println("Email:", add_user.Email)
同时在设定数据时并没有指定id,这样的话会自动递增生成,并且在创建也会将数据关联到add_user中
ID: 2
Username: test02
Phone: 123456
Password: 123456
Email: test02@gmail.com
当然 除了单个数据新增以外 gorm还支持更强大的多行、指定字段创建数据等功能
改变数据
还记得前面创建数据说过的 在创建好数据后 gorm会将数据表中的数据对变量进行关联吗
更改数据在这一方面体现的会更加明显
add_user := User{Username: "test02", Email: "test02@gmail.com", Password: "123456", Phone: "123456"}
db.Create(&add_user)
fmt.Println("ID:", add_user.ID)
fmt.Println("Username:", add_user.Username)
fmt.Println("Phone:", add_user.Phone)
fmt.Println("Password:", add_user.Password)
fmt.Println("Email:", add_user.Email)
add_user.Username = "test02_update"
db.Save(&add_user)
fmt.Println("Username:", add_user.Username)
ID: 2
Username: test02
Phone: 123456
Password: 123456
Email: test02@gmail.com
Username: test02_update
当然 gorm 还有更多强大的更改数据功能 例如批量更新等
删除数据
在 gorm 中 删除有两种
- 真删除
- 软删除
当然软删除的前提是数据表要有对应软删除的字段
当传入变量进行删除时 默认是根据变量的主键字段来进行删除的
// add_user 的 ID 是 `2`
db.Delete(&add_user)
当然也可以手动指定删除的主键字段号
db.Delete(&User{}, 2)
或是
db.Delete(&User{}, "2")
当然删除也有更多功能 例如批量删除等
结语
本篇文章只在基础知识上进行介绍
如果对于gorm有更多了解的话 请自行去gorm官网进行查看
GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.