gorm
go的orm
01 介绍和简单应用
- 安装gorm
go get -u github.com/jinzhu/gorm
连接不同的数据库要导入不同的驱动,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"
- 连接mysql
package main
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
dsn := "root:12345678@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local"
DB, _ := gorm.Open("mysql", dsn) // 是*gorm.DB类型
defer DB.Close()
}
注意:
DB
是*gorm.DB类型
- 简单应用
package main
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
// 购物信息
type Shopping struct {
Id int
Name string
Message string
}
func main() {
dsn := "root:12345678@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local"
DB, _ := gorm.Open("mysql", dsn) // 是*gorm.DB类型
defer DB.Close()
DB.AutoMigrate(&Shopping{}) // 自动迁移数据库
// 新增数据
shop1 := Shopping{
Id: 1,
Name: "apple",
Message: "apple is cool",
}
DB.Create(&shop1)
// 查询数据
shop2 := &Shopping{
Id: 2,
} // 也可以 shops := new(Shoping)
DB.First(shop2) // 查询id为2的第一个数据
fmt.Println(shop2)
var shop3 Shopping
DB.Find(&shop3, "id=?", 1) // 第二个参数是相当于sql语句的where,后两个参数可以不填,默认是所有数据的最后一个
fmt.Println(shop3)
// 修改数据
DB.Model(&shop2).Update("Name", "mac") // 把Id等于2的Name字段改为mac
// 删除数据
DB.Delete(&shop2) // 把Id等于2的数据删除
}
注意:
查询时DB.First()
参数必须是指针
02 模型定义
模型一般都是普通的结构体
默认使用id
作为主键
type User struct {
gorm.Model
Name string
Age sql.NullInt64
Birthday *time.Time
Email string `gorm:"type:varchar(100)"` // varchar类型
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:"-"` //忽略这个字段
}
支持的结构体标签
![image-20210311185714796](/Users/user/Library/Application Support/typora-user-images/image-20210311185714796.png)
关联的结构标签
![image-20210311185816818](/Users/user/Library/Application Support/typora-user-images/image-20210311185816818.png)
Gorm.Model
是一个包含四个特殊字段的结构体:
ID
:主键
CreateAt
:首次创建时间
UpdatedAt
:每次更新的当前时间
DeletedAt
:有该字段时,当删除实例时,并没有被从数据空删除,只是把该字段设置为当前时间
可以嵌入自定义的模型中
package main
import "github.com/jinzhu/gorm"
type Shopping struct {
gorm.Model
Name string `gorm: "type:varchar(128);default:lynn"`
Message string
}
- 表名设置
默认的是结构体名称的复数
可以禁用默认的配置,就是结构体名称本身
package main
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
dsn := "root:12345678@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local"
DB, _ := gorm.Open("mysql", dsn)
DB.SingularTable(true) // 禁用表名变成复数
defer DB.Close()
}
自定义表名
DB.Table("new_user").CreateTable(&User{}) // 指定new_user 为结构体User的表名
g修改默认表名
gorm.DefaultTableNameHandler(DB, "默认表名")
- 列名设置
package shop
import "github.com/jinzhu/gorm"
type Shopping struct {
gorm.Model
NameInfo string `gorm: "column:name_info"` // 设置NameInfo的数据库字段名为name_info
Message string
}