安装
go get -u github.com/jinzhu/gorm
连接数据库
db, err := gorm.Open("mysql", "root:root@tcp(localhost:3306)/testgorm?charset=utf8&parseTime=True&loc=Local")
第一个参数:指你想要连接的数据库
第二个参数:指的是数据库的设置信息:用户名:密码@tcp(ip:port)/数据库名字?charset=utf8&parseTime=True&loc=Local
charset=utf8 设置字符集
parseTime=True 为了处理time.Time loc=Local 时区设置,与本地时区保持一致
记得释放数据库资源 defer de.Close()
创建表
type User struct {
Age int
Name string
}
func main() {
...
//创建表 User->users
db.CreateTable(&User{})
//Table
db.Table("User").CreateTable(&User{})
}
删除表
db.DropTable(&User{})
db.DropTable("user")
判断表是否存在
flag := db.HasTable(&User{})
增加数据
db.Create(&User{Age:18,Name:"丽丽"})
查询数据
var myuser User
db.First(&myuser, "age = ?", 18)
fmt.Println(myuser)
更新数据
db.Model(&myuser).Update("age",30) //先查询再删除,承接上文
删除数据
db.Delete(&myuser) //先查询,再删除
表名命名方法,默认调用
func (MyUser) TableName() string{
return "test_my_user"
}
gorm.Mode 匿名字段
只需要在自己的模型中指定gorm.Mode匿名字段,即可在数据库表中包含四个字段:ID,CreatedAt,UpdatedAt,DeletedAT
ID:主键自增长
CreatedAt:用于存储记录的创建时间
UpdatedAt:用于存储记录的修改时间
DeLetedAt:用于存储记录的删除时间
type MyUser struct {
gorm.Model
Age int
Name string
}
结构体标签 grom
1、-: 忽略,不映射这个字段
gorm:"-"
适合:一些冗余字段,不想在数据库中体现,只想在结构体中体现
2、primary_key:主键
gorm:"primary_key"
3、AUTO_INCREMENT:自增
gorm:"AUTO_INCREMENT"
4、not null:不为空,默认为空
gorm:"not null"
5、index:索引,
gorm:"index"
创建索引并命名:eg: gorm:"index:idx_name_code"
6、unique_index:唯一索引
gorm:"unique_index"
唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。添加唯一性索引的数据列可以为空,但是只要存在数据值,就必须是唯一的。
7、unique:唯一
gorm:"unique"
8、column:指定列名
gorm:"column:user_name"
9、size:字符串长度,默认为255
gorm:"size:10"
10、default: 默认值
default:'男'
11、type:设置sql类型
gorm:"type:int(2)"
表关系
一对一
type User struct {
UserId int `gorm:"primary_key;AUTO_INCREMENT"`
Age int
Name string
IID int
}
type UserInfo struct {
InfoID int `gorm:"primary_key;AUTO_INCREMENT"`
Pic string
Address string
Email string
User User `gorm:"ForeignKey:IID;AssociationForeignKey:InfoID"`
}
一对多
type Author struct {
AID int `gorm:"primary_key;AUTO_INCREMENT"`
Name string
Age int
Sex string
AS []Article `gorm:"ForeignKey:AuId;AssociationForeignkey:AID"`
}
type Article struct {
ArId int `gorm:"primary_key;AUTO_INCREMENT"`
Title string
Content string
Desc string
AuId int
}
多对多
type Student struct {
SID int `gorm:"primary_key"`
SNo int
Name string
Age int
Sex string
Course []Course `gorm:"many2many:Student2Course"`
}
type Course struct {
CId int `gorm:"primary_key"`
CName string
TeacherName string
Room string
}
一对一操作
添加数据
userinfo := demostruct.UserInfo{
Pic: "/upload/1.jpg",
Address: "北京海淀区",
Email: "124234@123",
User: demostruct.User{
Age: 19,
Name: "John",
},
}
db.Create(&userinfo)
查询数据
var userifo UserInfo
db.First(&userinfo, "info_id = ?", 1)
fmt.Println(userinfo)
Debug():查看SQL原理
如果执行上面这一步,那么关联的User信息查询不到
Association
db.Model(&userinfo).Association("User").Find(&userinfo.User)
model参数:要查询的表数据
Association参数:关联到具体的模型
find参数:查询的数据要放在什么字段中
需要配合上文代码一起使用
Preload
//关联查询操作
var userinfo UserInfo
db.Preload("User").Find(&userinfo, "info_id = ?", 1)
Related
var user UserInfo
db.First(&userinfo, "info_id = ?", 1)
var user User
db.Model(&userinfo).Related(&user, "User")
fmt.Println(user)
fmt.Println(userinfo)
数据更新
先查询再更新
var userinfo UserInfo
db.Preload("User").Find(&userinfo, "info_id = ?", 1)
db.Model(&userinfo.User).Update("age",31)
如果需要改动指定的记录必须加入限定条件:
db.model(...).Where(...).update
数据删除
var userinfo UserInfo
db.Preload("User").Find(&userinfo, "info_id = ?", 1)
db.Delete(&userinfo.User)
一对多的更新、删除操作须进一步添加限定条件,where
常用方法
First:按照条件查询,并且升序排列,查询出一条记录
var user User
db.First(&user,1) --默认情况查询的是主键
db.First(&user, "user_id = ?", 1)
FirstOrCreate:有数据就查询出来,没有就创建一条数据
user2 := User{
...
}
db.FirstOrCreate(&user,user2)
Last:按照条件查询,并且降序排列,查询出一条记录
db.Last(&user, 1)
Take:按照条件查询,查询出一条记录
db.Take(&user, 1)
Find:按照条件查询
user_id_arr := []int{1, 2}
db.Find(&user, user_id_arr)
where:加入指定的条件
db.Where("user_id = ?", 1).First(&user)
db.Where("user_id int (?), []int{1, 2}).First(&user)
Select:筛选查询出来的字段
db.Select("name, age").Where("user_id = ?", 1).First(&user)
Create:添加数据
Save:添加数据
Update:更新数据
Delete:删除数据
Not:排除某个具体条件的查询操作
db.Not("user_id = ?", 1).Find(&users)
Or:多个条件的查询
db.Where("user_id = ?", 1).Or("user_id = ?", 3).Find(&users)
Order:进行升序或者降序的排列
db.Where("age = ?", 14).Order("user_id asc").Find(&users)
Limit:指定获取记录的最大数量
db.Limit(2).Find(&users)
Offset:设置偏移
db.Offset(1).Limit(2).Find(&users)
Scan:将结果扫描到另一个结构体中
type UserDemo struct {
Name string
Age int
}
var userdemo UserDemo
Var user User
db.Where("user_id = ?", 1).Find(&user).Scan(&userdemo)
Count:计数
var count int
db.Find(&users).Count(&count)
GROUP:进行分组
Having:分组后进行过滤
db.Select(age,count(*) as count).Group("age").Find(&users).Having("age > 18")
LogMod:
Gorm内置的日志记录器,显示详细日志
利用Debug只能逐条打印对应日志信息,但是设置LogMod(true)相当于设置了全局打印,所有执行的逻辑日志都会帮我们输出打印
db.LogMode(true) --开启打印日志