1、完成数据库的连接
在项目文件中首先创建一个初始化数据库的文件夹,为了方便这里设置为initDB在这里创建一个initDB.go文件,里面放着数据库的初始化的函数。
由于go语言的包管理机制,函数、变量、接口、结构体的首字母必须大写才能被其他的包访问,这里我首先创建一个*gorm.DB的操作数据库的对象变量var Db *gorm.DB
之后使用变量来记录需要连接数据的各个参数,使用gorm.Open()函数完成数据库的连接,gorm.Open函数的函数签名是:func Open(dialector Dialector, opts ...Option) (db *DB, err error)返回一个数据库连接的指针变量和一个错误处理。
if err!=nil {
//在日志中打印数据库连接失败的原因
log.Println("数据库连接失败,error="+err.Error())
}
package initDB
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
var Db *gorm.DB
func InitDb() {
var err error
username := "root"
password := "1234"
//IP地址
host := "127.0.0.1"
//端口
port := 3306
//连接带的数据库
Dbname := "ginhello"
//设置超时的时间。
timeout := "10s"
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
Db, err = gorm.Open(mysql.Open(dsn))
if err != nil {
log.Println("数据库连接失败,error=", err.Error())
}
}
2、初始化表结构
创建student student2两个结构体,声明结构体时添加上json 和 gorm标签,json 标签在序列化和反序列化 JSON 数据时非常有用。它使得结构体字段能够更好地与 JSON 数据进行交互,从而实现准确的字段映射和控制。需要注意的是,json 标签仅在使用 encoding/json 包进行 JSON 序列化和反序列化时有效,其他包可能不会使用这些标签。
json 标签指定了字段在 JSON 中的名称,使得JSON 字符串中的字段为first_name 和 last_name,而不是结构体字段的实际名称。
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
}
func main() {
p := Person{
FirstName: "John",
LastName: "sanye",
}
jsonData, _ := json.Marshal(p)
fmt.Println(string(jsonData))
}
同理gorm创建数据库表的时候 根据gorm标签信息在创建数据库的时候完成数据库表的字段属性,例如:
type Student struct {
Id uint `json:"id" gorm:"size:10;primaryKey"`
Name string `json:"name" gorm:"size:16"`
Age int `json:"age" gorm:"size:3"`
Email *string `json:"email" gorm:"size:128"`
Date string `gorm:"size:30;default:2022-8-20;comment:日期"`
}
设置Id字段为主键,占用的字节大小为10...以及设置Date为default字段设置默认的日期comment设置数据库表的备注信息。
创建出来结构体对象后gorm框架可以使用AutoMigrate()方法创建一个数据库表。
// 如果Email 是*string的类型的话就是为了存空值
type Student struct {
Id uint `json:"id" gorm:"size:10"`
Name string `json:"name" gorm:"size:16"`
Age int `json:"age" gorm:"size:3"`
Email *string `json:"email" gorm:"size:128"`
Date string `gorm:"size:30;default:2022-8-20;comment:日期"`
}
func Create_Student() {
err := initDB.Db.Debug().AutoMigrate(&Student{})
if err != nil {
log.Println("error is" + err.Error())
}
}
// 使用json标签后 json序列化后 使用string()就可以使用json的名称
type Student2 struct {
ID uint `gorm:"size:3" json:"id"`
Name string `gorm:"size:8" json:"name"`
Age int `gorm:"size:3" json:"age"`
Gender bool
Email *string `gorm:"size:128" json:"email"`
}
func Create_Student2() {
err := initDB.Db.Debug().AutoMigrate(&Student2{})
if err != nil {
log.Println("error is" + err.Error())
}
}
数据库表插入数据
由于设置Email字段为指针类型(Email 设置为指针类型后可以方便传空值)首先定义一个email变量设置它的值
email:="sanye@acoier.com",使用create()函数插入字段。
s1 := model.Student2{
Name: "sanye",
Age: 21,
Gender: true,
Email: &email,
}
err := initDB.Db.Debug().Create(&s1).Error
if err != nil {
log.Println("error is" + err.Error())
}
fmt.Printf("%+v\n", s1)
由于Db 这个变量在initDB这个包下面 initDB.Db调用这个包的变量Debug()函数显示数据库创建的信息,create()方法里面传入一个结构体的指针类型。
除了单个的插入数据还可以使用一个切片 批量的插入数据。
var StudentList []model.Student2
//批量的插入
var StudentList []model.Student2
for i := 0; i < 10; i++ {
StudentList = append(StudentList, model.Student2{
Name: fmt.Sprintf("sanye%d", i+1),
Age: 18 + i + 1,
Gender: false,
Email: &email,
})
}
err := initDB.Db.Debug().Create(&StudentList).Error
if err != nil {
log.Println("error is", err.Error())
}
数据库表结构的基础查询
首先定义一个数据库结构体的切片 var s1 []model.Student2,使用Find()函数查询结果
err := initDB.Db.Debug().Find(&s1, "name=?", "sanye9").Error
if err!=nil {
log.Println("error is"+err.Error())
}
return s1
s1就是查询后输出的结果。
表结构的更新
使用Updates完成字段的更新,首先定义一个结构体var StudentList []model.Student2
//使用结构体的方法来做
initDB.Db.Debug().Find(&StudentList, "age=?", 27).Updates(model.Student2{
Age: 18,
Name: "sanye最好了",
})
Find()函数查找所有的符合条件的字段进行修改。
表结构的删除
var student []model.Student2 创建student切片,使用Delete方法根据字段查询数据进行删除。
err := initDB.Db.Debug().Delete(&student, "age=? and name=?", 24, "sanye7").Error
if err != nil {
log.Println("error is " + err.Error())
}