本文只展示简单的建表(迁移)与记录的增删查改功能,各功能的高级配置与方法后续单独学习记录。
利用gorm连接上mysql,编写如下OpenDB()函数
func OpenDB() {
dsn := "root:adss123@tcp(127.0.0.1:3306)/go_db?charset=utf8mb4&parseTime=True&loc=Local"
res, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
db = res
if err != nil {
log.Fatal(err)
}
fmt.Printf("成功:%v\n", db)
}
创建模型
type TestTb2 struct {
Username string
Password string
gorm.Model
}
根据驼峰命名法命名模型,其中嵌套的Model中已经定义了主键ID且为自增长。
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
创建表
利用gorm中的 db.AutoMigrate() 迁移方法创建表
func CreateTable(Any any) {
OpenDB()\\连接数据库
err := db.AutoMigrate(Any)\\Any是模型
if err != nil {
fmt.Printf("创建表失败:err%v\n", err)
} else {
fmt.Printf("创建表成功:%v\n", Any)
}
}
实际使用只需要调用CreateTable()方法即可,当中参数Any一定是模型的指针。
例如:
func main() {
user := &TestTb2{}
CreateTable(user)
}
利用 db.Create() 方法实现一条记录的创建
func InsertInfo(Any any) {
OpenDB()
create := db.Create(Any)
if create.Error != nil {
fmt.Printf("插入失败:err%v\n", create.Error)
} else {
fmt.Printf("插入成功:%v\n", Any)
}
}
记录查询牵扯了很多关联,条件。本章暂时只记录了两个简单的查询方法,其余功能在查询学习中单独记录。
利用db.Frist()查找第一个符合条件的记录
db.First(&product, 1) // 根据整型主键查找
db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
利用此方法编写的查询函数如下
func QueryByPrimarykey(Any any, Id int) {
OpenDB()
first := db.First(Any, Id)
if first.Error != nil {
fmt.Printf("查找失败:err%v\n", first.Error)
} else {
fmt.Printf("查找成功:结果为%v\n", Any)
}
}
func QueryByName(Any any, name string) {
OpenDB()
first := db.First(Any, "username=?", name)
if first.Error != nil {
fmt.Printf("查找失败:err%v\n", first.Error)
} else {
fmt.Printf("查找成功:结果为%v\n", Any)
}
}
当中 db.First() 可以替换 db.Last() (查询最后一条符合条件的记录),db.Find() (查询全部符合条件的记录)等等。
暂时通过查询记录,与db.Save()方法联合实现修改记录的简单方法,更多Update方法后续在修改学习中再着重记录
func UpdateInfo(Any *TestTb2, Id int, Username string) {
OpenDB()
first := db.First(Any, Id)
if first.Error != nil {
fmt.Printf("查找失败:err%v\n", first.Error)
} else {
Any.Username = Username
save := db.Save(Any)
if save.Error != nil {
fmt.Printf("修改失败:err%v\n", save.Error)
} else {
fmt.Printf("修改成功:修改值为%v\n", Any)
}
}
}
删除也只暂时通过查询记录与db.Delete()方法联合实现的删除简单功能
func DeleteInfo(Any any, Id int) {
OpenDB()
first := db.First(Any, Id)
if first.Error != nil {
fmt.Printf("查找失败:err%v\n", first.Error)
} else {
del := db.Delete(Any)
if del.Error != nil {
fmt.Printf("删除失败:err%v\n", del.Error)
} else {
fmt.Printf("删除成功:删除了%v条\n", del.RowsAffected)
}
}
}
在模型含有Model结构体时,删除操作执行的是 软删除 ,会在删除记录上增加时间,但不会真的删除该记录,后续查找时,因为删除记录不为null,被删除的记录不会被查询出来。
以上为利用gorm对mysql的建表与记录的增删查改的功能的简易实现方法,各功能的细节将在后续学习中,具体记录。