使用 GORM(Go 的 ORM 库)连接数据库,并实现增删改查操作,把实现过程整理成文章 | 豆包MarsCode AI刷题

113 阅读5分钟

前言

本文是使用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 中钩子方法
  • 支持 PreloadJoins 的预加载
  • 事务,嵌套事务,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

其中要修改的有五处 分别是

  1. 数据库账户名称 对应 user 字符串
  2. 数据库账户密码 对应 pass 字符串
  3. 连接url(本人是直接用的本地的 就可以用 127.0.0.1 或是 localhost )
  4. 连接url对应的数据库端口(默认为3306)
  5. 要连接的数据库名称 对应 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.io/zh_CN/docs/…

改变数据

还记得前面创建数据说过的 在创建好数据后 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 中 删除有两种

  1. 真删除
  2. 软删除

当然软删除的前提是数据表要有对应软删除的字段

当传入变量进行删除时 默认是根据变量的主键字段来进行删除的

// 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.