文章目录
- 安装
- 连接数据库
- Gorm基本示例
- 自动迁移
- 创建数据行
- 查询数据
- 更新数据
- 删除数据
- Gorm Model
- 主键
- 表名
- 列名
- 时间戳
- CreatedAt
- UpdatedAt
- DeletedAt
GORM(Go Object Relational Mapper)是一个在Go语言中使用的对象关系映射(ORM)库。它允许开发者通过Go语言的结构体来定义数据模型,而不必直接编写SQL语句,从而简化了与数据库的交互和操作。
安装
go get -u github.com/jinzhu/gorm
连接数据库
gorm中有连接多种数据库的方式,这里以Mysql为例
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
// 连接mysql数据库
db, err := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/users?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
panic(err)
}
defer db.Close()
}
Gorm基本示例
首先创建一个struct,用来表示数据库中的数据。
type UserInfo struct {
ID uint
Name string
Gender string
Hobby string
}
自动迁移
gorm框架自带的自动迁移功能使得开发者能够根据Go语言中定义的结构体自动创建或更新数据库表结构,而不必手动编写SQL语句。
根据上面定义的struct,只需要用AutoMigrate
方法就能实现,会把结构体和数据表进行对应。
db.AutoMigrate(&UserInfo{})
执行代码后发现数据库users中多出来一个user_infos
的表。
创建数据行
u1 := UserInfo{ID: 1, Name: "xay", Gender: "男", Hobby: "swim"}
db.Create(&u1)
运行结果如下图所示。
查询数据
var u UserInfo
db.First(&u)
fmt.Printf("u:%v", u)
// 运行结果:u:{1 xay 男 swim}
更新数据
db.Model(&u).Update("Hobby", "双色球")
// 运行结果:u:{1 xay 男 双色球}
删除数据
db.Delete(&u)
Gorm Model
GORM内置了一个gorm.Model
结构体。gorm.Model
是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的结构体,用继承的方式来使用。也可以自己定义字段。
type User struct {
gorm.Model
Name string
Age sql.NullInt64
Birthday *time.Time
Email string `gorm:"type:varchar(100);unique_index"`
Role string `gorm:"size: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:"-"` // 忽略本字段
}
主键
该Model会默认使用字段中的id来作为主键,自己定义的格式如下:
// 使用`AnimalID`作为主键
type Animal struct {
AnimalID int64 `gorm:"primary_key"`
Name string
Age int64
}
表名
在gorm.Model
创建表时,会自动将表名定义为struct名的复数,如果遇到用驼峰法命名的struct名,会用下划线连接单词。自己定义的格式如下:
func (User) TableName() string {
return "profiles"
}
func (u User) TableName() string {
if u.Role=="admin" {
return "admin_users"
} else {
return "users"
}
}
用如下代码禁用复数命名
db.SingularTable(true)
也可以使用Table()
方法来创建表
db.Table("xiaowang").CreateTable(&User{})
GORM还支持更改默认表名称规则,如果是指定的表名则不支持修改:
gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string {
return "prefix_" + defaultTableName;
}
列名
列名由字段名称进行下划线分割来生成,如上面的MemberNumber
在数据库中变成member_number
如果想要指定列名,可以用struct tag来实现
type Animal struct {
AnimalId int64 `gorm:"column:beast_id"` // set column name to `beast_id`
Birthday time.Time `gorm:"column:day_of_the_beast"` // set column name to `day_of_the_beast`
Age int64 `gorm:"column:age_of_the_beast"` // set column name to `age_of_the_beast`
}
时间戳
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
字段为当前时间,而不是直接将记录从数据库中删除。