Gorm
1. 准备工作
首先进入终端下载我们需要的包(确保go和mysql安装完成,并设置了环境变量)
go get -u gorm.io/driver/mysql
go get -u gorm.io/gorm
有两份官方文档有对 GORM 更详细的讲解。
- 创建 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.(中文)
- 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的对应关系
| GO | mysql |
|---|---|
| 结构体 | 数据表 |
| 结构体实例 | 数据行 |
| 结构体字段 | 字段 |
例如,一个结构体:
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