数据库的连接
对于 mysql 数据库
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
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{})
if err != nil {
panic("failed to connect database")
}
}
以上将 user, pass, dbname字段填入对于数据库即可连接到 mysql 对应的数据库
数据库中表的创建 (可以通过自动迁移来进行创建)
AutoMigrate()
例如:
// UserInfo 用户信息
type UserInfo struct {
ID uint
Name string
Gender string
Hobby string
}
func main() {
dsn := "root:@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 自动迁移
err = db.AutoMigrate(&UserInfo{})
if err != nil {
panic("failed to migrate")
}
}
这样则 gorm 会根据 UserInfo 结构体 来创建对应的 表结构 但默认会使用 snack_case 的命名方式 如果想要使用其他的方式, 可以通过 TableName 函数接口的实现来改变表中的命名 eg:
func (u UserInfo)TableName string {
return "userInfo"
}
gorm 支持结构体标记(tags)
声明 model 时,tag 是可选的,tag 名大小写不敏感,但相对而言建议使用 camelCase 风格
在 gorm 中, 会默认把 名为 ID 的作为主键 (Primary Key) eg:
type User struct {
ID string // 名为`ID`的字段会默认作为表的主键
Name string
}
// 使用`AnimalID`作为主键
type Animal struct {
AnimalID int64 `gorm:"primary_key"`
Name string
Age int64
}
数据库中数据的 增删查改
增加 (Create)
用于创建记录
type User struct {
ID uint
Name string
Age uint8
Birthday time.Time
}
result := db.Create(&user) // 通过数据的指针来创建
fmt.Println(user.ID) // 返回插入数据的主键
fmt.Println(result.Error) // 返回 error
fmt.Println(result.RowsAffected) // 返回插入记录的条数
通过网课与gorm文档可知 Create 可以创建多条记录: 通过在 Create 的参数中填入数组即可创建多条记录 并且可以缺省不重要的字段 同时在 gorm 中也支持使用 map 来插入记录 例如: map[string]interface{} 与 map[string]interface{}{} 但是要注意: 从 map 创建时,不会调用 hook,不会保存关联,主键值也不会返回填充
查找 (Find, First, Last)
用于查找对应的记录, 一般可以配合 Where 等一起使用 First方法对数据库进行查询时相当于 LIMIT 1, 既查询第一个数据 而 Last 方法刚好相反, 是对最后一个数据进行查询 要查询所有满足条件的结果就要使用Find方法来获得所有结果
删除 (Delete)
可以使用 Delete 方法来删除指定条件的数据
注意如果当所创建的表中有 DeleteAt字段, 则可以自动获得软删除的功能, 当调用 Delete方法时不会从数据库中将该记录真正的删除, 只会将DeletedAt 字段的值会被设置为当前时间此时如果想要永久删除就要调用 Unscoped方法来Delete
修改 (Update)
使用 Update 方法可以对对应数据进行修改, 一般先通过 Model 来获得对应的表, 然后对表中数据进行修改, 但要注意通过结构体不能修改零值, 要将零值修改需要使用 map 来对其进行修改