GORM

208 阅读4分钟

安装

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) --开启打印日志