使用GORM连接数据库
GORM是一个使用Go语言编写的ORM框架。
GORM 官方支持的数据库类型有:MySQL, PostgreSQL, SQLite, SQL Server 和 TiDB
如何使用GORM连接数据库,并实现增删改查CURD操作?下面我们来实践操作一下。
安装
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
1. 导入GORM库和SQL Server驱动:
import (
"gorm.io/gorm"
"gorm.io/driver/sqlserver"
)
2. 创建数据库连接:
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"的数据库列。可以根据需要添加更多的标签来指定其他信息,如数据类型、约束等。
标签是用反引号 ` 来定义的,放置在字段的后面。以下是一些常用的标签及其用法:
1. column 标签:用于指定字段在数据库表中的列名。
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"column:user_name"`
Age int `gorm:"column:age"`
}
2. type 标签:用于指定字段在数据库中的数据类型。
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"type:varchar(50)"`
Age int `gorm:"type:int"`
}
3. size 标签:用于指定字段在数据库中的大小限制,仅对字符串字段有效。
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100"`
}
4. default 标签:用于指定字段在数据库中的默认值。
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"default:'Unknown'"`
Age int `gorm:"default:18"`
}
5. 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()等方法来查询数据。以下是一些示例代码:
1. 查询单条记录:
var user User
db.First(&user, 1)
上述代码使用First()方法查询User模型中ID为1的记录,并将结果保存到user变量中。
2. 查询多条记录:
var users []User
db.Find(&users)
上述代码使用Find()方法查询User模型的所有记录,并将结果保存到users切片中。
3. 条件查询:
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 {
// 处理错误
}