Gorm入门 | 青训营
Gorm
Gorm是一个Go语言的ORM库,它提供了丰富的功能,使得与数据库的交互变得简单且方便。
- 安装
首先,你需要在你的Go环境中安装Gorm。你可以使用以下命令来安装最新版本的Gorm:
bash复制代码
go get -u gorm.io/gorm
- 创建数据库连接
要使用Gorm,你需要创建一个数据库连接。以下是如何创建一个MySQL数据库的连接的例子:
go复制代码
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
dsn := "user:password@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 自动迁移模式
db.AutoMigrate(&User{})
}
在这个例子中,我们首先导入了gorm
和gorm.io/driver/mysql
库。然后我们创建了一个DSN(Data Source Name),这是一个字符串,用于指定如何连接到数据库。接下来,我们使用gorm.Open
函数和mysql.Open
函数来创建一个数据库连接。最后,我们使用db.AutoMigrate
函数来自动迁移模式,这意味着Gorm会自动创建或更新数据库中的表。
- 定义模型
在Gorm中,你需要定义一个Go结构体来表示你的数据库模型。以下是一个简单的例子:
go复制代码
type User struct {
ID uint `gorm:"primarykey"`
Name string `gorm:"not null"`
Age uint `gorm:"not null"`
}
在这个例子中,我们定义了一个名为User
的结构体,它有三个字段:ID
,Name
和Age
。每个字段都有一个对应的Go类型,并且都有一个gorm
标签,它用于指定该字段在数据库中的行为。例如,primarykey
标签表示该字段是主键,而not null
标签表示该字段不能为空。
- 查询数据
Gorm提供了多种查询数据的方法,以下是一些常用的查询方法:
db.Find(&users)
:查询所有用户数据并存储到users
切片中。db.First(&user, id)
:查询第一个ID为指定值的用户数据。db.Last(&user)
:查询最后一个用户数据。db.Where("name = ?", "John").Find(&users)
:查询名字为John的用户数据并存储到users
切片中。db.Where("age > ?", 18).Find(&users)
:查询年龄大于18的用户数据并存储到users
切片中。db.Select("name, age").Find(&users)
:只查询名字和年龄数据并存储到users
切片中。db.Order("age desc").Find(&users)
:按年龄降序查询用户数据并存储到users
切片中。db.Scopes(&User{}).First(&user, 1)
:创建一个动态的查询范围并执行第一个查询。db.Raw("SELECT * FROM users WHERE age > ?", 18).Scan(&users)
:直接执行原生的SQL查询并存储到users
切片中。db.Model(&User{}).Where("name = ?", "John").Count(&count)
:计算符合查询条件的数据行数。
- 创建数据
要创建新的数据,你可以创建一个新的模型实例,然后使用db.Create
方法。以下是一个例子:
go复制代码
user := User{Name: "John Doe", Age: 25}
db.Create(&user)
在这个例子中,我们创建了一个新的User
实例,然后使用db.Create
方法将其保存到数据库中。
- 更新数据
要更新已经存在的数据,你可以首先查询数据,然后修改其字段,最后使用db.Save
方法。以下是一个例子:
go复制代码
db.First(&user, 1)
user.Age = 26
db.Save(&user)
在这个例子中,我们首先查询了ID为1的用户,然后将年龄修改为26,最后使用db.Save
方法将修改后的用户数据保存到数据库中。
- 删除数据
要删除已经存在的数据,你可以使用db.Delete
方法。以下是一个例子:
go复制代码
db.First(&user, 1)
db.Delete(&user)
在这个例子中,我们首先查询了ID为1的用户,然后使用db.Delete
方法将该用户从数据库中删除。
- 链式查询
Gorm支持链式查询,你可以在一个查询中执行多个操作。以下是一个例子:
go复制代码
var users []User
db.Where("age > ?", 18).Order("age desc").Find(&users)
在这个例子中,我们首先使用db.Where
方法查询年龄大于18的用户,然后使用db.Order
方法按照年龄降序排序,最后使用db.Find
方法将结果存储到users
切片中。
- 关联查询
Gorm支持关联查询,你可以查询一个模型与另一个模型之间的关联关系。以下是一个例子:
go复制代码
var user User
db.Preload("Posts").First(&user)
在这个例子中,我们首先使用db.Preload
方法预加载用户的关联数据(例如用户的帖子),然后使用db.First
方法查询第一个用户的数据。这样,我们可以一次性地查询用户及其关联数据。 10. 数据库事务
Gorm支持数据库事务,你可以使用它来执行一组相关的数据库操作,并在出现错误时进行回滚。以下是一个例子:
go复制代码
db.Begin()
user.Name = "John Doe"
db.Save(&user)
db.Create(&Post{Title: "Hello World", UserId: user.ID})
db.Commit()
在这个例子中,我们首先使用db.Begin
方法开启了一个新的事务。然后我们修改了用户的名字,并使用db.Save
方法保存了修改。接着,我们创建了一个新的帖子,并指定了用户ID。最后,我们使用db.Commit
方法提交了事务,将所有的修改保存到数据库中。
- 模型关联
模型关联是Gorm的一个强大功能,它允许你在不同的模型之间建立关联关系。这有助于简化数据库操作,并使代码更具可读性和可维护性。
在Gorm中,你可以使用Association
字段来定义一个模型与另一个模型的关联关系。以下是一些常用的关联关系:
- 一对一关联:
在一对一关联中,一个模型与另一个模型有一个一对一的关系。这通常用于表示一个用户与他的账户信息的关系。
go复制代码
type User struct {
gorm.Model
Name string
Acc Acc `gorm:"association_autoupdate:false;association_autocreate:false"`
}
type Acc struct {
gorm.Model
UserID uint
// other fields
}
在这个例子中,Acc
模型与User
模型建立了一对一关联。这意味着每个用户都有一个与之关联的账户信息。注意,我们需要在Acc
模型中添加UserID
字段作为外键,并使用UserID
字段将两个模型关联起来。
- 一对多关联:
在一对多关联中,一个模型与另一个模型有一个一对多的关系。这通常用于表示一个用户与他的多个帖子之间的关系。
go复制代码
type User struct {
gorm.Model
Name string
// other fields
}
type Post struct {
gorm.Model
UserID uint
Title string
// other fields
}
在这个例子中,Post
模型与User
模型建立了一对多关联。这意味着每个用户都可以有多个帖子。我们需要在Post
模型中添加UserID
字段作为外键,并使用UserID
字段将多个帖子与特定用户关联起来。
- 多对多关联:
在多对多关联中,两个或多个模型之间有一个多对多的关系。这通常用于表示用户与角色之间的关系。
go复制代码
type User struct {
gorm.Model
Name string
// other fields
}
type Role struct {
gorm.Model
Name string
// other fields
}
在这个例子中,我们有两个模型:User
和Role
。这两个模型之间有一个多对多的关系,表示每个用户可以拥有多个角色,每个角色也可以被多个用户拥有。要实现这个关联关系,我们需要在两个模型之间添加一个中间表(或中间模型),该表包含与两个模型相关的外键。
以上是Gorm中常用的三种关联关系。通过合理地使用这些关联关系,你可以轻松地处理复杂的数据库操作。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgakacb
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01