← 所有笔记

go Gorm连接数据库,并实现增删改查操作

深入结合 mysql 语句 与 gorm,一文上手Gorm

Gorm

1. 准备工作

首先进入终端下载我们需要的包(确保go和mysql安装完成,并设置了环境变量)

go get -u gorm.io/driver/mysql
go get -u gorm.io/gorm

有两份官方文档有对 GORM 更详细的讲解。

  1. 创建 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.(中文)
  2. go-sql-driver/mysql: Go MySQL Driver is a MySQL driver for Go’s (golang) database/sql package (github.com)
2. 连接数据库

这里以mysql为例,其他数据库请看官方文档。

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func main() {
   
   
  // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
   
   })
}

user -> 用户名

pass -> 密码

127.0.0.1 -> mysql默认本地地址,也就是localhost

3306 -> mysql默认端口

dbname -> 数据库名称

charset -> 字符集编码

parseTime -> 把数据库datetime和date类型转换为golang的time.Time类型

loc -> 使用系统本地时区

gorm.config{} 中可以进行一些高级配置,详情请看官方文档。

例如:

我们可以在其中写入:
Logger: logger.Default.LogMode(logger.Info)

这个句子的作用是配置GORM库,告诉它使用默认的日志记录器并将日志模式设置为信息级别(logger.Info),以便在终端中输出有关数据库操作的信息。

这样我们在对使用GORM的时候就可以在终端中看到输出的对应SQL语句了。

3. 结构体与mysql table 的映射关系

go的orm框架可以让我们在用go语言实现数据库操作的时候不使用sql语言,简单易上手,提高开发效率。

下面是gorm中go与mysql的对应关系

GOmysql
结构体数据表
结构体实例数据行
结构体字段字段

例如,一个结构体:

type Student struct {
   
   
	ID                int
	Name              string
	age               int
	ExternalCharacter string
}

gorm 会将其映射为

CREATE TABLE `students` (
    `id` bigint AUTO_INCREMENT,
    `name` longtext,
    `external_character` longtext,
    PRIMARY KEY (`id`)
)

这里可以发现,结构体字段中的大写都变成了小写,age完全消失,Student也变成了students,ExternalCharacter变成了external_character。这里涉及到了gorm的映射规定。

具体可看模型定义 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

简单来说,就是咱要首字母大写,会按驼峰命名法给我们加 _ 符号,默认ID 为主键,表名会变成复数。

再看数据类型,明显这是不知道有多大所以往大了去调。

当然,这些我们也是能够一一自定义的。

3.1. 表名:

实现Tabler接口 中的TableName函数。

例如,针对上述的结构体,我们可以这样写:

func (s *Student) TableName() string {
   
   
	return "student"
}

这样表名就会被映射为student而不是students

3.2 字段名:

我们可以在字段后面打上gorm tag,tag有很多用途,比如标记主键,指定not null等等,具体请看官方文档。

这里介绍自定义字段名,还是以上述的结构体为例:

type Student struct {
   
   
	ID                int `gorm:"column:序号"`
	Name              string
	age               int
	ExternalCharacter string `gorm:"column:externalCharacter"`
}

如果我们改成这样的话,映射的表就是这样的:

CREATE TABLE `student` (
    `序号` bigint AUTO_INCREMENT,
    `name` longtext,
    `externalCharacter` longtext,
    PRIMARY KEY (`序号`)
)
3.2 数据类型

将longtext改成 varchar(255) ,也是通过tag实现的。通过size:255来确定最大长度

把bigint改成int只需要将int改成int32就行了,因为go中,咱64位的电脑默认int是int64

例如:

type Student struct {
   
   
	ID                int32
	Name              string
	age               int
	ExternalCharacter string `gorm:"column:externalCharacter; size:255"`
}

映射出来的表就是这样的

CREATE TABLE `student` (
    `id` int AUTO_INCREMENT,
    `name` longtext,
    `externalCharacter` varchar(255),
    PRIMARY KEY (`id`)
)

tag中定义多种内容,中间打;号就行了

4. 创建table

我们可以通过 db.AutoMigrate 和 db.Migrator().CreateTable() 方法来创建table。

AutoMigrate 方法:

使用 db.AutoMigrate 方法是一种自动创建和迁移数据库表的方式。它会根据你的 GORM 模型定义,自动检查数据库表是否存在,如果不存在则创建表,如果表结构有变化则进行迁移。这种方式适用于开发过程中的快速迭代和维护数据库结构的情况。

示例:

// 自动创建和迁移表
err := db.AutoMigrate(&Student{
   
   })
// 这里的db就是上述gorm.open的db哈
if err != nil {
   
   
    panic("创建/迁移表格失败, error = " + err.Error())
}

Migrator().CreateTable 方法:

使用 db.Migrator().CreateTable 方法是一种手动创建数据库表的方式。你需要显式地指定要创建的表,它不会检查是否已经存在,而是直接创建表。这种方式适用于在特定情况下需要手动控制表创建过程的情况。

示例:

// 手动创建表
err := db.Migrator().CreateTable(&Student{
   
   })
if err != nil {
   
   
    panic("创建表格失败, error = " + err.Error())
}

区别总结:

  • AutoMigrate 方法自动根据模型定义创建和迁移表,适用于自动化和快速迭代。
  • Migrator().CreateTable 方法手动创建表,适用于需要手动控制创建过程的情况。

在实际应用中,你可以根据项目需求选择合适的方法。通常情况下,开发和调试阶段可能更适合使用 AutoMigrate 方法,而特定场景下的手动控制可能需要使用 Migrator().CreateTable 方法。

5. 增

以下列结构体为例:

type Student struct {
   
   
	ID                int
	Name              string
	Age               int
	ExternalCharacter string `gorm:"column:externalCharacter; size:255"`
}

func (s *Student) TableName() string {
   
   
	return "student"
}
5.1. db.Create(结构体对象)
lisi := Student{
   
   2, "lisi", 18, "modest"}
result := db.Create(&lisi)
if result.Error != nil {
   
   
    panic("插入字段失败, error = " + result.Error.Error())
}
fmt.Println(result.RowsAffected) // 返回影响的行数 1

等于INSERT INTO student (name,age,externalCharacter,id) VALUES ('lisi',18,'modest',2)

当然也可以同时增添多个字段

例如:

students := []Student{
   
   
    {
   
   ID: 3, Name: "wangwu", Age: 20, ExternalCharacter: "generous"},
    {
   
   ID: 4
✳

谢谢你读到这里。

更新于 2023-09-16

搜索笔记

搜索文章标题、标签和正文。

↑ ↓ 选择 · Enter 阅读Esc 关闭