1. 什么是GORM
GORM是使用广泛的Go语言ORM(对象关系映射)库,它为Go语言提供了一个简单而强大的数据库操作工具。作为ORM库,GORM的主要目标是实现对象和数据库之间的映射关系,使得我们可以通过操作对象来进行数据库的增删改查等操作,而无需直接编写SQL语句。
GORM在Go语言中被广泛应用,它支持多种主流的数据库,如MySQL、PostgreSQL、SQLite等。使用GORM,可以轻松地定义数据模型(结构体),并利用GORM提供的API进行数据库的各种操作,如创建表、插入数据、查询数据、更新数据和删除数据等。
在本次青训营大作业中,我们的项目使用GORM作为ORM,完成与数据库的连接、CRUD操作。
2. GORM连接数据库
【注意】 建议将数据库信息放置在单独的config文件中,并设置gitignore!
-
使用GORM的
Open函数来建立与数据库的连接。该函数接受两个参数:数据库类型和连接字符串。连接字符串包含数据库的连接信息,如用户名、密码、主机名、端口号和数据库名称等。
以MySQL为例,连接字符串的格式如下:
dsn := "user:password@tcp(host:port)/database?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})其中,"user"、"password"、"host"、"port"和"database"分别表示数据库的用户、密码、主机名、端口和数据库名。
-
配置数据库连接池(可选) 可以根据需要配置数据库连接池的参数,如最大连接数、最大空闲连接数等。你可以通过GORM的
DB方法获取底层的*sql.DB对象,然后使用其方法来配置连接池。例如,设置最大连接数和最大空闲连接数:
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) sqlDB, err := db.DB() sqlDB.SetMaxOpenConns(100) sqlDB.SetMaxIdleConns(10) -
测试连接 为了确保成功建立数据库连接,可以使用GORM的
DB方法获取底层的*sql.DB对象,并调用其Ping方法来测试连接。db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) sqlDB, err := db.DB() err = sqlDB.Ping() if err != nil { // 连接失败处理 } -
关闭数据库连接 在程序退出前,应该关闭数据库连接,以释放资源。可以使用GORM的
DB方法获取底层的*sql.DB对象,并调用其Close方法来关闭连接。db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) sqlDB, err := db.DB() defer sqlDB.Close()
3. GORM数据库操作
一般情况下,应该在Model层定义数据映射的实体类,并适当地添加GORM字段,这样GORM可以自动加载模型并映射到数据库中。
- 数据模型
在GORM中,我们可以通过定义Go结构体来映射数据库表。通过在结构体上使用GORM的标签(tag),我们可以指定表名、字段名、主键、索引等。 下面的代码定义了一个User结构体,映射为User表:
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"column:name"`
Age int `gorm:"column:age"`
}
使用AutoMigrate方法可以根据结构体定义自动创建表:
db.AutoMigrate(&User{})
- CRUD
-
插入数据:
使用GORM的Create方法可以向数据库插入新的数据。例如,插入一条新的用户记录:
user := User{Name: "John", Age: 25} db.Create(&user) -
查询数据:
GORM提供了多种查询方式,可以根据条件查询数据。
例如,查询所有用户记录:
var users []User db.Find(&users)根据条件查询单个用户记录:
var user User db.Where("name = ?", "John").First(&user) -
更新数据:
使用GORM的Save方法可以更新数据库中的数据。例如,更新用户的年龄:
var user User db.First(&user) user.Age = 30 db.Save(&user) -
删除数据:
使用GORM的Delete方法可以从数据库中删除数据。例如,根据条件删除用户记录:
db.Where("age > ?", 30).Delete(&User{})
4. 链式操作和Raw SQL
-
链式操作
GORM提供了丰富的链式操作方法,可以在查询过程中逐步添加条件、排序规则和限制条件等。这种方式使得查询语句更加清晰和易于构建。
例如,根据条件查询年龄大于等于18且性别为男性的用户记录: 在链式操作中,我们可以使用
Where方法添加查询条件,Order方法指定排序规则,Limit和Offset方法进行分页查询等。var users []User db.Where("age >= ?", 18).Where("gender = ?", "male").Find(&users) -
Raw SQL
GORM的
Raw方法提供了使用原始SQL语句的功能,这在某些复杂的查询场景下非常有用。通过使用Raw方法,我们可以直接执行自定义的SQL语句,并将结果映射到Go结构体中。例如,执行原始SQL查询并将结果映射到User结构体:
var users []User db.Raw("SELECT * FROM users WHERE age >= ? AND gender = ?", 18, "male").Scan(&users)【注意】 使用Raw SQL时,需要注意保护好应用程序免受SQL注入攻击。可以使用参数绑定(placeholder)和预编译语句等技术来确保执行的SQL语句安全可靠。