GORM是golang的一个ORM,封装了很多常用方法。在相关数据库操作系统中方便使用。本文主要讲解一些常用的方法,GORM的一些概念和注意事项。
1,下载安装
windows系统下下载安装可以直接使用git命令行工具进行获取。
方法:
go get -u github.com/jinzhu/gorm
在代码中引用时需要引用gorm类库和对应的数据库操作的驱动,数据库可以支持sqlite,mssql,mysql等等。
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
2,数据库连接
db,err:=gorm.Open("mysql","root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8")
gorm.Open()第一个参数表示连接的数据库的类型,第二个参数包括数据库的用户名,密码,Ip地址,端口号,具体数据库和编码规则。
db.AutoMigrate(&User{})
db.AutoMigrate(&User{}, &Product{}, &Order{})
gorm可以支持自动迁移,也就是自动的表结构迁移,只会创建表,补充缺少的列,缺少的索引。但并不会更改已经存在的列类型,也不会删除不再用的列,这样设计的目的是为了保护已存在的数据。可以同时针对多个表进行迁移设置。
3,表结构操作
表结构操作包括表创建,表是否存在,删除,修改,创建索引,外键等等。
func main(){
db,err:=gorm.Open("mysql","root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8")
if err!=nil {
panic("connection failure")
}
db.HasTable("优快云")
db.HasTable(&优快云{})
}
type 优快云 struct{
gorm.Model
AId string `gorm:default:'fuck'`
Content string
}
通过调用db.HasTable来判断是否存在表,但是参数可以使用两种形式,一种是表名的字符串,一种是模型的地址类型。
此时定义模型时在struct添加了一行gorm.model,表示继承自gorm.Model类型。改类型定义了若干个表中常用字段,当创建模型时也会自动创建gorm.Model中定义的字段。注意:定义模型时,必须指定字段的首字母为大写,如果不大写则无法创建字段。也可以使用gorm tag进行制定默认值。
gorm.Model的结构:每次更新都会修改UpdatedAt字段,删除数据时默认只修改DeleteAt字段为当前时间,但数据库中并不会删除,只不过查询时再也查不到。
type Model struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time `sql:"index"`
CreatedBy uint
}
表的创建:
db.CreateTable(&优快云{})
在创建表后,数据库会出现表的复数形式,例如csdn表创建后在数据库中为csdns表。如果不想创建复数形式的表名,可以设置一下语句:
db.SingularTable(true) //全局设置表名不可以为复数形式。
如果想自己根据不同的条件来创建对应的表名,可以重写模型的TableName方法:
func (c *优快云)TableName() string {
if c.AId == "1" {
return "Admin_T"
} else {
return "Guest_T"
}
}
表的删除:
r1:=db.DropTable("优快云")
r2:=db.DropTable(&优快云{})
与创建表类似,都可以使用表名字符串或者模型地址类型进行删除。
如果在删除时需要删除两个表,并且需要用到同步概念,则需要在事务中创建。gorm中事务处理与其他语言不同,因为golang中没有try catch的结构,所以只能通过条件判断来进行处理回滚或者提交。
tx:=db.Begin()
r1:=db.DropTable("优快云")
r2:=db.DropTableIfExists(&优快云{})
if r1.Error!=nil || r2.Error!=nil {
tx.Rollback()
return
}
tx.Commit()
如果使用了事务,那么所有的相关处理就需要使用事务类型进行调用数据库的操作方法。修改表的列:
db.Model(&优快云{}).ModifyColumn("a_id","int")
修改指定模型对应的表的列时,修改的列的名称应为数据库中表对应的列名称。例如模型中定义的AId字段在生成数据表列时为a_id,两个大写字母开头的单词默认以下划线连接。注意:此处有个GORM的bug,还需要看一下GORM的源码,本人的GORM的源码中sql语句错误,需要改一下。
删除表的列:
v0:=db.Model(&优快云{}).DropColumn("Content")
创建索引:
db.Model(&优快云{}).AddIndex("kaldf","id_a")
索引还可以创建唯一索引。删除索引等等。
创建外键:
db.Model(&优快云{}).AddForeignKey("a_id","user(user_id)","RESTRICT","RESTRICT")
第一个参数表示表中字段,第二个参数表示外键表中的字段。4,数据表的CRUD
新增:需要先创建模型的对象,在插入数据后通过NewRecord返回值判断是否插入成功,如果成功则返回false
c:=优快云{AId:100}
db.Create(&c)
m:=db.NewRecord(c)
fmt.Println(m)
插入的时候可以设置回调函数,在回调函数中做一系列的处理
func (user *User) BeforeCreate(scope *gorm.Scope) error {
scope.SetColumn("ID", uuid.New())
return nil
}
查询:查询的方法比较多,例如first,Last,where等等。