一、使用形式
1、引入gorm包
import "github.com/jinzhu/gorm"
2、导入数据库驱动
import _ "github.com/go-sql-driver/mysql"
为了方便记住导入路径,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:
1、
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
2、
import (
"github.com/jinzhu/gorm"
_ "github.com/go-sql-driver/mysql"
)
3、连接数据库
// 连接数据库
用户名:密码@tcp(ip:port)/数据库?charset=utf8&parseTime=True&loc=Local
db, err := gorm.Open("mysql", "root:123456@tcp(localhost:3306)/go_project?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic(err)
}
defer db.Close() // 关闭空闲的连接
4.DDL操作
type User struct {
Id int
Name string
Age int
}
// 创建表
db.Table("user").CreateTable(&User{}) // 指定表名
db.CreateTable(&User{}) // 不指定表名,模型后面会加个s
DML操作
// 1. 增
//db.Create(&models.User{Name: "李四", Age: 18, Addr: "xxx", Pic: "/static/upload/pic.png", Phone: "123456789"})
//查询
var user models.User
//db.First(&user, 1) // 默认id
//db.First(&user, "name=?", "张三") // // 指定字段
//fmt.Println(user)
// 更新
//db.First(&user, 1)
//db.Model(&user).Update("age", 22)
//db.Model(&user).Update("addr", "zs-xxxx")
// 删除
db.First(&user, 2)
db.Delete(&user)
模型定义
用作数据库数据转换和自动建表
模型名和表名的映射关系
- 规则
- 第一个大写字母变为小写,
- 遇到其他大写字母变为小写并且在前面加下划线,
- 连着的几个大写字母,只有第一个遵循上面的两条规则,其他的大写字母转为小写,不加下划线,遇到小写,前面的第一个大写字母变小写并加下划线
- 复数形式
- 举例
- User --> users 首字母小写,复数
- UserInfo --> user_infos
- DBUserInfo --> db_user_infos
- DBXXXXUserInfo --> dbxxxx_user_infos
在默认表名上加其他规则
// 在默认表名前加sys_前缀
gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string {
return "sys_" + defaultTableName;
}
自定义表名:
func (模型) TableName() string{
return "新的表名"
}
package models
import "github.com/jinzhu/gorm"
type GormModel struct {
gorm.Model
Name string
}
func (GormModel) TableName() string {
return "test_gorm_model"
}
结构体字段名和列名的对应规则
- 规则 * 列名是字段名的蛇形小写
- 举例
- Name --> name
- CreatedTime --> create_time
- 可以通过gorm标签指定列名,AnimalId int64 `gorm:"column:beast_id"`
gorm.Model
基本模型定义gorm.Model,包括字段ID,CreatedAt,UpdatedAt,DeletedAt
只需要在自己的模型中指定gorm.Model匿名字段,即可使用上面的四个字段
// 添加字段 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`
type User struct {
gorm.Model
Name string
}
ID:主键自增长
CreatedAt:用于存储记录的创建时间
UpdatedAt:用于存储记录的修改时间
DeletedAt:用于存储记录的删除时间
结构体标签gorm的使用
type UserInfo struct {
Id int `gorm:"primary_key"`
Name string `gorm:"index"`
Age int
}
gorm标签属性值
- -: 忽略,不映射这个字段 `gorm:"-"`
- primary_key:主键 `gorm:"primary_key"`
- AUTO_INCREMENT:自增 `gorm:"AUTO_INCREMENT"`
- not null:不为空,默认为空 `gorm:"not null"`
- index:索引, `gorm:"index"`
- 创建索引并命名: `gorm:"index:idx_name_code"`
-
- 优化查询,相当于图书的目录
-
unique_index:唯一索引 `gorm:"unique_index"`
-
unique:唯一 `gorm:"unique"`
-
column:指定列名 `gorm:"column:user_name"`
-
size:字符串长度,默认为255 `gorm:"size:64"`
- type:设置sql类型 `gorm:"type:varchar(100)"` // 不推荐直接改类型
- default `default:'galeone'` 默认值
多个属性值之间用分号分隔(英文的;):`gorm:"size:64;not null"`
一对一
package relate_tables
// 一对一
type User struct {
Id int
Name string
Age int
Addr string
}
type UserProfile struct {
Id int
Pic string
CPic string
Phone string
User User // 关联关系
UserID int
}
// 一对一
// 属于
type User struct {
Id int
Name string
Age int
Addr string
}
type UserProfile struct {
Id int
Pic string
CPic string
Phone string
//User User // 关联关系
User User `gorm:"ForeignKey:UId;AssociationForeignKey:Id"` // 关联关系
//UserID int // 默认关联字段
UId int //uid
}
包含
// 包含
type User struct {
Id int
Name string
Age int
Addr string
PId int
}
type UserProfile struct {
Id int
Pic string
CPic string
Phone string
User User `gorm:"ForeignKey:PId;AssociationForeignKey:Id"` // 关联关系
}
一对多
// 一对多
type User2 struct {
Id int
Name string
Age int
Addr string
Articles []Article `gorm:"ForeignKey:UId;AssociationForeignKey:Id"`
}
type Article struct {
Id int
Title string
Content string
Desc string
// 外键
UId int
}
多对多
type Article2 struct {
AId int `gorm:"primary_key:true"`
Title string
Content string
Desc string
Tags []Tag `gorm:"many2many:Article2s2Tags"` // ;ForeignKey:AId;AssociationForeignKey:TId
}
type Tag struct {
TId int `gorm:"primary_key:true"`
Name string
Desc string
}
一对一操作