GORM操作MySQL
使用GORM连接上面的db1进行创建、查询、更新、删除操作。
var (
DB *gorm.DB
)
type Userinfo struct {
ID int
Name string
Gender string
Hobby string
}
func initMySQL() (err error) {
dsn := "root:123456@tcp(localhost:3306)/bubble?charset=utf8"
DB, err = gorm.Open("mysql", dsn)
fmt.Println("err ", err)
if err != nil {
return err
}
// 判断是否连接成功
return DB.DB().Ping()
}
func main() {
// 连接数据库
err := initMySQL()
if err != nil {
panic("连接数据库失败")
}
defer DB.Close()
// 模型绑定
DB.AutoMigrate(&Userinfo{})
//创建记录
u1 := Userinfo{1, "打阿伟", "男", "玩云桑"}
DB.Create(&u1)
var u Userinfo
DB.First(&u) //查询表的第一条数据
fmt.Println(u)
//更新
DB.Model(&u).Update("hobby", "打阿伟")
//删除
DB.Delete(&u)
}
GORM Model定义
在使用ORM工具时,通常我们需要在代码中定义模型(Models)与数据库中的数据表进行映射,在GORM中模型(Models)通常是正常定义的结构体、基本的go类型或它们的指针。 同时也支持sql.Scanner及driver.Valuer接口(interfaces)
为了方便模型定义,GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的Golang结构体。
var (
DB *gorm.DB
)
//定义模型
type User struct {
gorm.Model //内嵌gorm.Model
Name string
Age sql.NullInt64 //零值类型
Birthday *time.Time
Email string `gorm:"type:varchar(100);unique_index"` //建立唯一索引 email不能重复
Role string `gorm:"size:255"` // 设置字段大小为255
MemberNumber *string `gorm:"unique;not null"` // 设置会员号(member number)唯一并且不为空
Num int `gorm:"AUTO_INCREMENT"` // 设置 num 为自增类型
Address string `gorm:"index:addr"` // 给address字段创建名为addr的索引
IgnoreMe int `gorm:"-"` // 忽略本字段
}
func initMySQL() (err error) {
dsn := "root:123456@tcp(localhost:3306)/bubble?charset=utf8"
DB, err = gorm.Open("mysql", dsn)
fmt.Println("err ", err)
if err != nil {
return err
}
// 判断是否连接成功
return DB.DB().Ping()
}
func main() {
//给表名加前缀
gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
return "zn_" + defaultTableName
}
// 连接数据库
err := initMySQL()
if err != nil {
panic("连接数据库失败")
}
defer DB.Close()
DB.AutoMigrate(&User{})
}
结构体标记(tags)
使用结构体声明模型时,标记(tags)是可选项。gorm支持以下标记:
支持的结构体标记(Struct tags)
关联相关标记(tags)
时间戳跟踪
CreatedAt
如果模型有 CreatedAt字段,该字段的值将会是初次创建记录的时间。
db.Create(&user) // `CreatedAt`将会是当前时间
// 可以使用`Update`方法来改变`CreateAt`的值
db.Model(&user).Update("CreatedAt", time.Now())
UpdatedAt
如果模型有UpdatedAt字段,该字段的值将会是每次更新记录的时间。
db.Save(&user) // `UpdatedAt`将会是当前时间
db.Model(&user).Update("name", "jinzhu") // `UpdatedAt`将会是当前时间
DeletedAt
如果模型有DeletedAt字段,调用Delete删除该记录时,将会设置DeletedAt字段为当前时间,而不是直接将记录从数据库中删除。