Gorm快速入门
Gorm是Go语言的ORM框架,其特点有:
- 全特性 ORM (几乎包含所有特性)
- 模型关联 (一对一, 一对多,一对多(反向), 多对多, 多态关联)
- 钩子 (Before/After Create/Save/Update/Delete/Find)
- 预加载
- 事务
- 复合主键
- SQL 构造器
- 自动迁移
- 日志
- 基于GORM回调编写可扩展插件
- 全特性测试覆盖
- 开发者友好
快速开始:
-
安装
go get -u github.com/jinzhu/gorm
-
连接数据库:
db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local") if err!= nil{ panic(err) } defer db.Close()
-
增删改查
基本信息如下:
// UserInfo 用户信息
type UserInfo struct {
ID uint
Name string
Gender string
HA string
}
增加:
u1 := UserInfo{3, "枯藤", "男", "篮球"}
db.Create(&u1)
查询:
var u = new(UserInfo)
db.First(u)
fmt.Printf("%#v\n", u)
修改:
db.Model(&u).Update("hobby", "双色球")
删除:
db.Delete(&u)
全部代码:
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
// UserInfo 用户信息
type UserInfo struct {
ID uint
Name string
Gender string
HA string
}
func main() {
db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
if err!= nil{
panic(err)
}
defer db.Close()
u1 := UserInfo{3, "枯藤", "男", "篮球"}
u2 := UserInfo{4, "topgoer.com", "女", "足球"}
// 创建记录
db.Create(&u1)
db.Create(&u2)
// 查询
var u = new(UserInfo)
db.First(u)
fmt.Printf("%#v\n", u)
var uu UserInfo
db.Find(&uu, "hobby=?", "足球")
fmt.Printf("%#v\n", uu)
// 更新
db.Model(&u).Update("hobby", "双色球")
删除
db.Delete(&u)
}
模型定义:
模型一般为Golang的结构体,Go的基本数据类型或者指针。
例子:
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"` //设置字段的大小为255个字节
MemberNumber *string `gorm:"unique;not null"` // 设置 memberNumber 字段唯一且不为空
Num int `gorm:"AUTO_INCREMENT"` // 设置 Num字段自增
Address string `gorm:"index:addr"` // 给Address 创建一个名字是 `addr`的索引
IgnoreMe int `gorm:"-"` //忽略这个字段
}
支持的结构标签:
标签 | 说明 |
---|---|
Column | 指定列的名称 |
Type | 指定列的类型 |
Size | 指定列的大小,默认是 255 |
PRIMARY_KEY | 指定一个列作为主键 |
UNIQUE | 指定一个唯一的列 |
DEFAULT | 指定一个列的默认值 |
PRECISION | 指定列的数据的精度 |
NOT NULL | 指定列的数据不为空 |
AUTO_INCREMENT | 指定一个列的数据是否自增 |
INDEX | 创建带或不带名称的索引,同名创建复合索引 |
UNIQUE_INDEX | 类似 索引 ,创建一个唯一的索引 |
EMBEDDED | 将 struct 设置为 embedded |
EMBEDDED_PREFIX | 设置嵌入式结构的前缀名称 |
- | 忽略这些字段 |
规范:
gorm.Model
是一个包含一些基本字段的结构体, 包含的字段有 ID
,CreatedAt
, UpdatedAt
, DeletedAt
。
可以用它来嵌入到模型中,或者也可以用它来建立自己的模型。
// gorm.Model 定义
type Model struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time
}
// 将字段 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt` 注入到 `User` 模型中
type User struct {
gorm.Model
Name string
}
// 声明 gorm.Model 模型
type User struct {
ID int
Name string
}
gorm 默认使用ID作为主键名:
type User struct {
ID string // 字段名 `ID` 将被作为默认的主键名
}
// 设置字段 `AnimalID` 为默认主键
type Animal struct {
AnimalID int64 `gorm:"primary_key"`
Name string
Age int64
}
指定表名:
// 用 `User` 结构体创建 `delete_users` 表
db.Table("deleted_users").CreateTable(&User{})
var deleted_users []User
db.Table("deleted_users").Find(&deleted_users)
SELECT * FROM deleted_users;
db.Table("deleted_users").Where("name = ?", "jinzhu").Delete()
DELETE FROM deleted_users WHERE name = 'jinzhu';
修改表名:
可以通过定义 DefaultTableNameHandler
字段来对表名使用任何规则。
gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string {
return "prefix_" + defaultTableName;
}
时间戳跟踪:
对于有 CreatedAt
字段的模型,它将被设置为首次创建记录的当前时间。
对于有 UpdatedAt
字段的模型,它将被设置为记录更新时的当前时间。
db.Create(&user) // 将设置 `CreatedAt` 为当前时间
// 你可以使用 `Update` 方法来更改默认时间
db.Model(&user).Update("CreatedAt", time.Now())
db.Save(&user) // 将设置 `UpdatedAt` 为当前时间
db.Model(&user).Update("name", "jinzhu") // 将设置 `UpdatedAt` 为当前时间
自动迁移:
判断UserInfo 信息是否发送改变,若变化则自动迁移,即生成新的列,若没此表则创建此表。
db.AutoMigrate(&UserInfo{})