一、使用形式
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=Localdb, 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 intName stringAge 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 modelsimport "github.com/jinzhu/gorm"type GormModel struct {gorm.ModelName 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.ModelName 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 intName stringAge intAddr string
}type UserProfile struct {Id intPic stringCPic stringPhone stringUser User // 关联关系UserID int
}
// 一对一
// 属于
type User struct {Id intName stringAge intAddr string
}type UserProfile struct {Id intPic stringCPic stringPhone string//User User // 关联关系User User `gorm:"ForeignKey:UId;AssociationForeignKey:Id"` // 关联关系//UserID int // 默认关联字段UId int //uid
}
包含
// 包含type User struct {Id intName stringAge intAddr stringPId int}type UserProfile struct {Id intPic stringCPic stringPhone stringUser User `gorm:"ForeignKey:PId;AssociationForeignKey:Id"` // 关联关系}
一对多
// 一对多type User2 struct {Id intName stringAge intAddr stringArticles []Article `gorm:"ForeignKey:UId;AssociationForeignKey:Id"`
}type Article struct {Id intTitle stringContent stringDesc string// 外键UId int
}
多对多
type Article2 struct {AId int `gorm:"primary_key:true"`Title stringContent stringDesc stringTags []Tag `gorm:"many2many:Article2s2Tags"` // ;ForeignKey:AId;AssociationForeignKey:TId}type Tag struct {TId int `gorm:"primary_key:true"`Name stringDesc string}
一对一操作