#使用GORM实现增删改查
准备工作
- 安装并启动mysql
由于我本地已经配置好mysql,因此直接启动net start mysql
- 初始化代码仓库
mkdir gorm_project
cd gorm-project
go mod init main
- 导入gorm框架以及mysql驱动
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
新建main.go文件
实现
-
连接数据库
gorm库使用dsn作为连接数据库的参数,dsn翻译过来就叫数据源名称,用来描述数据库连接信息。一般都包含数据库连接地址,账号,密码之类的信息。
DSN格式:
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]
var db *gorm.DB
var err error
dsn := "root:122588@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("连接失败")
}
-
定义表model
在golang中gorm模型定义是通过struct实现的,这样我们就可以通过gorm库实现struct类型和mysql表数据的映射。gorm负责将对模型的读写操作翻译成sql语句,然后gorm再把数据库执行sql语句后返回的结果转化为我们定义的模型对象。
type User struct{
gorm.Model
Id int `gorm:"primaryKey;autoIncrement"`
Name string
Age int
}
//运行模型迁移,此时就把表创建好了
db.AutoMigrate(&User{})
使用gorm.Moder,在创建的时候gorm会自动添加created-at与deleted_at,updated_at三个列,对应着创建时间,删除时间(软删除),更新时间
- 增删改查
- 增
func createUser(db *gorm.DB, name string, age int) {
user := User{Name: name, Age: age}
db.Create(&user)
}
使用gorm的Create方法增加一个User,将user对象转换为sql语句插入到表中
- 删
func deleteUser(db *gorm.DB, id int) error {
user, err := getUser(db, id)
if err != nil {
return err
}
res := db.Delete(&user)
return res.Error
}
使用gorm的Delete方法即可把指定的user删除,Delete方法还可以使用id删除等
- 改
func updateUser(db *gorm.DB, id int, name string, age int) error {
user, err := getUser(db, id)
if err != nil {
return err
}
user.Name = name
user.Age = age
res := db.Save(&user)
return res.Error
}
使用gorm的Save方法,将user存入数据库中,这样会覆盖数据中user的数据,即可完成更新操作
- 查
func getUser(db *gorm.DB, id int) (User, error) {
var user User
result := db.First(&user, id)
if result.Error != nil {
return user, result.Error
}
return user, nil
}
使用gorm的First方法即可在数据库中查询到指定id的user数据
完整代码
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct{
gorm.Model
Id int `gorm:"primaryKey;autoIncrement"`
Name string
Age int
}
var db *gorm.DB
func createUser(db *gorm.DB, name string, age int) {
user := User{Name: name, Age: age}
db.Create(&user)
}
func getUser(db *gorm.DB, id int) (User, error) {
var user User
result := db.First(&user, id)
if result.Error != nil {
return user, result.Error
}
return user, nil
}
func updateUser(db *gorm.DB, id int, name string, age int) error {
user, err := getUser(db, id)
if err != nil {
return err
}
user.Name = name
user.Age = age
res := db.Save(&user)
return res.Error
}
func deleteUser(db *gorm.DB, id int) error {
user, err := getUser(db, id)
if err != nil {
return err
}
res := db.Delete(&user)
return res.Error
}
func main(){
var err error
dsn := "root:122588@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("连接失败")
}
db.AutoMigrate(&User{})
//增
createUser(db,"顶针",20)
createUser(db,"芙蓉王",21)
//查
user, err := getUser(db,1)
if err != nil {
panic(err)
}
fmt.Println(user)
//改
err = updateUser(db,1,"顶针",21)
if err != nil {
panic(err)
}
fmt.Println(getUser(db,1))
//删
err = deleteUser(db,1)
if err != nil {
panic(err)
}
}