使用GORM连接数据库并实现CRUD操作 | 青训营
GORM 是一个 Go 的 ORM(Object-Relationl Mapping)框架,它可以把我们的数据结构映射到关系型数据库中,支持的数据库有 MySQL、 PostgreSQL、 SQlite、 SQL Server。
GORM 可以让我们屏蔽底层的 SQL 语句,并且使用 GORM 操作数据库除了对不同数据库的连接操作有区别之外,其它的操作对所有数据库都是通用的,我们不用每种数据库都要学习一遍不同的操作方法。
安装
go get -u gorm.io/gorm
连接数据库
想要连接数据库,我们还需要引入对应的数据库 driver,以下为各个数据库的引入地址,之后使用 Open() 方法来开启一个数据库连接。
"gorm.io/driver/mysql" //MySQL
"gorm.io/driver/postgres" //PostgreSQL
"gorm.io/driver/sqlite" //SQLite
"gorm.io/driver/sqlserver" //SQL Server
连接MySQL
连接MySQL数据库的步骤如下:
- 导入GORM库和MySQL驱动:
import (
"gorm.io/gorm"
"gorm.io/driver/mysql"
)
- 创建数据库连接:
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 {
// 处理错误
}
其中,user
是MySQL用户名,password
是密码,127.0.0.1:3306
是MySQL服务器的地址和端口,database
是要连接的数据库名。
- 定义数据模型:
type User struct {
gorm.Model
Name string
Age int
}
- 迁移数据表:
db.AutoMigrate(&User{})
这会自动创建一个名为users
的数据表,用于存储User
模型的数据。
- 进行数据库操作:
// 创建数据
user := User{Name: "Alice", Age: 20}
db.Create(&user)
// 查询数据
var result User
db.First(&result, 1) // 根据ID查询第一条记录
// 更新数据
db.Model(&result).Update("Age", 25)
// 删除数据
db.Delete(&result)
连接SQL Server
- 导入GORM库和SQL Server驱动:
import (
"gorm.io/gorm"
"gorm.io/driver/sqlserver"
)
- 创建数据库连接:
dsn := "sqlserver://username:password@localhost:1433?database=dbname"
db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{})
if err != nil {
// 处理错误
}
其中,username
是SQL Server用户名,password
是密码,localhost:1433
是SQL Server服务器的地址和端口,dbname
是要连接的数据库名。
- 定义数据模型、迁移数据表、进行数据库操作与MySQL数据库一样。
定义数据模型
数据模型定义是指在GORM中定义结构体来表示数据库表。
在GORM中,可以使用结构体来定义数据模型。每个字段对应数据库表中的一个列。以下是一个示例:
type User struct {
gorm.Model
Name string
Age int
Email string
Password string
}
上面的代码定义了一个名为"User"的数据模型,包含了Name、Age、Email和Password四个字段。其中,Name、Age、Email和Password分别对应了数据库表中的四个列。gorm.Model
是GORM提供的内置模型,用于自动管理常见字段,如ID、CreatedAt、UpdatedAt和DeletedAt。
可以根据实际需求在结构体中添加更多的字段和标签。标签可以用于指定数据库表的列名、数据类型、约束等信息,以便与数据库进行正确的映射。
例如,可以使用标签来指定列名和数据类型:
type User struct {
gorm.Model
Name string `gorm:"column:name"`
Age int `gorm:"column:age"`
Email string `gorm:"column:email"`
Password string `gorm:"column:password"`
}
上面的代码中,使用gorm:"column:name"
标签将Name字段映射到名为"name"的数据库列。可以根据需要添加更多的标签来指定其他信息,如数据类型、约束等。
标签是用反引号 ` 来定义的,放置在字段的后面。以下是一些常用的标签及其用法:
column
标签:用于指定字段在数据库表中的列名。
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"column:user_name"`
Age int `gorm:"column:age"`
}
type
标签:用于指定字段在数据库中的数据类型。
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"type:varchar(50)"`
Age int `gorm:"type:int"`
}
size
标签:用于指定字段在数据库中的大小限制,仅对字符串字段有效。
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100"`
}
default
标签:用于指定字段在数据库中的默认值。
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"default:'Unknown'"`
Age int `gorm:"default:18"`
}
unique
标签:用于指定字段是否要创建唯一约束。
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"unique"`
}
迁移数据表
在GORM中,可以使用AutoMigrate()
方法来迁移数据表,它会根据数据模型自动创建或更新数据库表结构。要迁移数据表,首先需要创建数据库连接,然后调用AutoMigrate()
方法,并传入相应的数据模型。
在执行 AutoMigrate()
方法后,GORM会自动检查数据库并根据数据模型定义创建或更新表结构。如果表不存在,则会创建相应的表;如果表已存在,则会检查字段的变化并进行更新。
需要注意的是,在进行数据迁移时,GORM会根据数据模型的定义来创建相应的表结构,但不会保留已有的数据。如果需要保留已有数据,请在迁移前备份数据或使用适当的迁移策略。
在实际开发中,可以根据需要进行多次迁移,以便添加新的数据模型或更新表结构。可以根据具体情况在 AutoMigrate()
方法中传入多个数据模型来进行迁移。
db.AutoMigrate(&User{}, &Product{}, &Order{})
以上代码将同时迁移 User
、Product
和 Order
三个数据模型对应的数据表。通过迁移数据表,可以方便地管理数据库表结构,确保数据模型与数据库的一致性,简化数据库操作。
数据库操作
在GORM中进行数据库操作主要涉及以下几个常用的操作:创建数据、查询数据、更新数据和删除数据。
创建数据
要在GORM中创建数据,可以使用Create()
方法。以下是一个示例代码:
user := User{Name: "Alice", Age: 20}
db.Create(&user)
在上述代码中,我们创建了一个名为user
的User
结构体对象,并使用Create()
方法将其保存到数据库中。&user
表示传递user
的指针给Create()
方法。
需要确保数据库连接db
已经建立,并且User
模型已经定义和迁移。
Create()
方法会将数据插入到数据库表中,并在插入成功后,自动更新模型对象的ID
字段和其他可能的时间戳字段(如CreatedAt
)。
在创建数据时,GORM会自动为模型对象生成一个唯一的ID,如果模型中定义了gorm.Model
,则会自动包含ID
、CreatedAt
、UpdatedAt
和DeletedAt
字段。
需要注意的是,在创建数据时,应该检查错误并进行适当的错误处理。例如:
if err := db.Create(&user).Error; err != nil {
// 处理错误
}
在错误处理中,可以根据具体的业务需求,选择合适的方式进行错误处理,如返回错误信息、记录日志等。
查询数据
在GORM中,可以使用First()
、Find()
和Where()
等方法来查询数据。以下是一些示例代码:
- 查询单条记录:
var user User
db.First(&user, 1)
上述代码使用First()
方法查询User
模型中ID为1的记录,并将结果保存到user
变量中。
- 查询多条记录:
var users []User
db.Find(&users)
上述代码使用Find()
方法查询User
模型的所有记录,并将结果保存到users
切片中。
- 条件查询:
var user User
db.Where("age > ?", 18).First(&user)
上述代码使用Where()
方法添加条件,查询age
大于18的第一条记录,并将结果保存到user
变量中。
- 排序查询:
var users []User
db.Order("age desc").Find(&users)
上述代码使用Order()
方法指定按照age
字段降序排序,查询所有User
记录,并将结果保存到users
切片中。
需要注意的是,在查询数据时,应该检查错误并进行适当的错误处理。例如:
var user User
if err := db.First(&user, 1).Error; err != nil {
// 处理错误
}
更新数据
在GORM中更新数据,可以使用Model()
和Update()
方法。以下是一个示例代码:
var user User
db.First(&user, 1) // 查询要更新的记录
user.Age = 25 // 修改数据
db.Model(&user).Update("Age", user.Age) // 执行更新操作
在上述代码中,我们首先使用First()
方法查询ID为1的记录,并将结果保存到user
变量中。然后,我们修改了user
对象的Age
字段值为25。
接下来,我们使用Model()
方法传入&user
来指定要更新的模型对象,并使用Update()
方法来执行更新操作。在Update()
方法中,我们传入要更新的字段名和字段值,这里是"Age"
和user.Age
。
需要注意的是,在使用Update()
方法更新数据时,GORM会自动根据模型对象的主键(通常是ID
字段)来确定要更新的记录。因此,在更新数据之前,我们需要确保user
对象的主键字段的值是正确的。
另外,如果只需更新模型对象的部分字段,还可以使用Updates()
方法。以下是一个示例代码:
db.Model(&user).Updates(User{Age: 25, Name: "Bob"})
在上述代码中,我们使用Updates()
方法传入要更新的字段和对应的新值来更新数据。这里我们更新了Age
和Name
字段。
在更新数据时,同样需要检查错误并进行适当的错误处理。例如:
if err := db.Model(&user).Update("Age", user.Age).Error; err != nil {
// 处理错误
}
删除数据
在GORM中,可以使用Delete()
方法来删除数据。以下是一个示例代码:
var user User
db.First(&user, 1) // 查询要删除的记录
db.Delete(&user) // 执行删除操作
在上述代码中,我们首先使用First()
方法查询ID为1的记录,并将结果保存到user
变量中。
接下来,我们使用Delete()
方法传入&user
来执行删除操作。GORM会根据模型对象的主键(通常是ID
字段)来确定要删除的记录。
需要注意的是,在执行删除操作时,GORM只是标记了要删除的记录,而不是立即从数据库中删除。实际的删除操作将在事务提交时执行。
另外,可以通过Where()
方法添加条件来进行有条件的删除操作。以下是一个示例代码:
db.Where("age > ?", 30).Delete(&User{})
在上述代码中,我们使用Where()
方法添加条件,删除age
大于30的所有记录。
在删除数据时,同样需要检查错误并进行适当的错误处理。例如:
if err := db.Delete(&user).Error; err != nil {
// 处理错误
}
学习GORM经验
-
阅读官方文档:官方文档是学习和理解GORM的最佳资源。阅读官方文档可以了解GORM的各种特性、方法和用法,以及最佳实践和常见问题的解答。官方文档还提供了示例代码和代码片段,可以帮助你快速上手和理解GORM的使用方式。
-
实践和尝试:通过实际的项目和练习来应用GORM,可以加深对GORM的理解和掌握。尝试使用不同的功能和方法,进行增删改查等常见操作,通过实践来熟悉和掌握GORM的使用。
-
关注社区和开源项目:GORM是一个开源项目,有着活跃的社区支持和贡献。关注GORM的社区和开源项目,可以了解最新的更新和功能改进,还可以从其他开发者的经验和分享中学习到更多有用的知识和技巧。
-
注意错误处理:在使用GORM进行数据库操作时,应该注意错误处理。对于每个数据库操作,都应该检查并处理可能出现的错误。正确的错误处理可以帮助你及时发现和解决问题,提高程序的稳定性和可靠性。
-
学习数据库知识:虽然GORM提供了方便的数据库操作接口,但理解数据库的基本概念和原理仍然是很重要的。学习数据库知识可以帮助你更好地理解和使用GORM,优化数据库结构和查询,提高程序的性能和效率。
-
与其他工具和框架结合使用:GORM可以与其他工具和框架进行无缝集成,如gin、echo等Web框架,以及各种数据库连接池和缓存组件。了解和尝试与其他工具和框架的结合使用,可以提升开发效率和系统性能。
最重要的是,持续学习和实践。GORM是一个功能丰富且不断发展的ORM库,不断探索和学习新的功能和技术,可以帮助你更好地应用GORM,并在开发过程中获得更好的体验和效果。