gorm是一个使用Go语言编写的ORM框架。它文档齐全,对开发者友好,支持主流数据库。
1.GORM入门
1.1安装
go get -u github.com/jinzhu/gorm
1.2数据库驱动
连接不同的数据库都需要导入对应数据的驱动程序,GORM已经贴心的为我们包装了一些驱动程序
import _ "github.com/jinzhu/gorm/dialects/mysql"
// import _ "github.com/jinzhu/gorm/dialects/postgres"
// import _ "github.com/jinzhu/gorm/dialects/sqlite"
// import _ "github.com/jinzhu/gorm/dialects/mssql"
1.3连接MySQL
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
db, _ := gorm.Open("mysql", "root:123456@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
defer db.Close()
}
2.GORM操作MySQL
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
//User用户信息
type User struct {
ID uint
Name string
Age string
}
func main() {
db, err := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
panic(err)
}
defer db.Close()
db.AutoMigrate(&User{}) // 自动迁移
u1 := User{
ID: 1,
Name: "cheng",
Age: "18",
}
u2 := User{
ID: 2,
Name: "song",
Age: "20",
}
// 创建记录
db.Create(&u1)
db.Create(&u2)
//查询第一条记录
user1 := new(User)
db.First(user1)
fmt.Println(*user1) //{1 cheng 18}
//查询
var user2 User
db.Find(&user2,"name=?","cheng")
fmt.Println(user2) //{1 cheng 18}
//更新
db.Model(&u1).Update("name","jiacheng")
//删除
db.Delete(&u2)
}
3.GORM Model
在使用ORM工具时,通常我们需要在代码中定义模型(Models)与数据库中的数据表进行映射,在GORM中模型(Models)通常是正常定义的结构体、基本的go类型或它们的指针。 同时也支持sql.Scanner及driver.Valuer接口
type Model struct {
ID uint `gorm:"primary:key"`
CreateAt time.Time
UpdateAt time.Time
DeleteAt *time.Time
}
你可以将它嵌入到你自己的模型中:
type User struct {
gorm.Model
Name string
}
// 不使用gorm.Model
// 自行定义模型
type User struct {
ID int
Name string
}
3.1模型定义示例
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"` //唯一且不为空
Num int `gorm:"ATUO_INCREMENT"` //设置num为自增类型
Address string `gorm:"index:addr"` //给address字段创建名为addr的索引
IgnoreMe int `gorm:"-"` //忽略本字段
}
3.2结构体标记(tags)
结构体标记(Tag) | 描述 |
---|---|
Column | 指定列名 |
Type | 指定列数据类型 |
Size | 指定列大小, 默认值255 |
PRIMARY_KEY | 将列指定为主键 |
UNIQUE | 将列指定为唯一 |
DEFAULT | 指定列默认值 |
PRECISION | 指定列精度 |
NOT NULL | 将列指定为非 NULL |
AUTO_INCREMENT | 指定列是否为自增类型 |
INDEX | 创建具有或不带名称的索引, 如果多个索引同名则创建复合索引 |
UNIQUE_INDEX | 和 INDEX 类似,只不过创建的是唯一索引 |
EMBEDDED | 将结构设置为嵌入 |
EMBEDDED_PREFIX | 设置嵌入结构的前缀 |
- | 忽略此字段 |
3.3关联相关标记(tags)
结构体标记(Tag) | 描述 |
---|---|
MANY2MANY | 指定连接表 |
FOREIGNKEY | 设置外键 |
ASSOCIATION_FOREIGNKEY | 设置关联外键 |
POLYMORPHIC | 指定多态类型 |
POLYMORPHIC_VALUE | 指定多态值 |
JOINTABLE_FOREIGNKEY | 指定连接表的外键 |
ASSOCIATION_JOINTABLE_FOREIGNKEY | 指定连接表的关联外键 |
SAVE_ASSOCIATIONS | 是否自动完成 save 的相关操作 |
ASSOCIATION_AUTOUPDATE | 是否自动完成 update 的相关操作 |
ASSOCIATION_AUTOCREATE | 是否自动完成 create 的相关操作 |
ASSOCIATION_SAVE_REFERENCE | 是否自动完成引用的 save 的相关操作 |
PRELOAD | 是否自动完成预加载的相关操作 |
4.GORM约定
4.1主键(Primary Key)
type User struct {
ID string // 名为`ID`的字段会默认作为表的主键
Name string
}
type Student struct {
StudentID int64 `gorm:"primary_key"` //StudentID为主键
Name string
}
4.2表名(Table Name)
type User struct {} //默认表名是 `users`
func (User) TableName() string {
return "profiles"
}
type User struct {
ID uint
Name string
Age string
} //默认表名是 `users`
//func (User) TableName() string {
// return "profiles"
//}
func main() {
db, _ := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local")
// 禁用默认表名的复数形式,如果置为 true,则 `User` 的默认表名是 `user`
db.SingularTable(true)
db.AutoMigrate(&User{}) // 自动迁移
}
db.Table("userInfo").CreateTable(&User{})
var UserInfo []User
db.Table("userinfo").Find(&UserInfo) // SELECT * FROM userinfo;
fmt.Println(UserInfo)
db.Table("userinfo").Delete(&UserInfo,"name=?","cheng")
//DELETE FROM userinfo WHERE name = 'cheng';
4.3列名(Column Name)
type UserInfo struct {
ID uint
Name string
Birthday time.Time
CreateAt time.Time
}
type Person struct {
ID int64 `gorm:"column:Person_id"`
Birthday time.Time `gorm:"column:day"`
Age int64 `gorm:"Column:age"`
}
4.4时间戳跟踪
CreatedAt
模型有 CreatedAt字段,该字段的值将会是初次创建记录的时间。
type UserInfo struct {
ID uint
CreatedAt time.Time
}
func main() {
db, _ := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local")
db.AutoMigrate(&UserInfo{}) // 自动迁移
user := UserInfo{
ID: 1,
}
db.Create(&user)
}
db.Model(&user).Update("CreatedAt",time.Now())
UpdatedAt
模型有UpdatedAt字段,该字段的值将会是每次更新记录的时间。
type UserInfo struct {
ID uint
CreatedAt time.Time
UpdatedAt time.Time
}
func main() {
db, _ := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local")
db.AutoMigrate(&UserInfo{}) // 自动迁移
u1 := UserInfo{
ID: 1,
}
u2 := UserInfo{
ID: 2,
}
db.Create(&u1)
db.Save(&u2) //`UpdatedAt`将会是当前时间
}
db.Model(&user).Update("name", "jiacheng") // `UpdatedAt`将会是当前时间
DeletedAt
如果模型有DeletedAt字段,调用Delete删除该记录时,将会设置DeletedAt字段为当前时间,
而不是直接将记录从数据库中删除。
package main
import (
"github.com/jinzhu/gorm"
"time"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
type UserInfo struct {
ID uint
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt time.Time
}
func main() {
db, _ := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local")
//db.AutoMigrate(&UserInfo{}) // 自动迁移
db.Delete(&UserInfo{},"id=?","1")
}