安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
初始化数据库
db, err := gorm.Open(mysql.Open(viper.GetString("DB.dsn")), &gorm.Config{})
if err != nil {
return nil, err
}
这里的mysql.Open()里所需填的字符串格式如下:
"用户名:密码@tcp(数据库连接地址)/数据库名?charset=utf8mb4&parseTime=True&loc=Local"
gorm.open里传入的第一个参数为一个Dialector接口。接口的定义如下:
type Dialector interface {
Name() string
Initialize(*DB) error
Migrator(db *DB) Migrator
DataTypeOf(*schema.Field) string
DefaultValueOf(*schema.Field) clause.Expression
BindVarTo(writer clause.Writer, stmt *Statement, v interface{})
QuoteTo(clause.Writer, string)
Explain(sql string, vars ...interface{}) string
}
mysql.open会解析传入的dsn字符串,并返回一个Dialector结构体,这个结构体实现了gorm.Dialector接口。
声明模型
gorm.Model
GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
这里的User继承了gorm.Model
package model
type User struct {
gorm.Model
Id int64 `protobuf:"varint,1,req,name=id" json:"id,omitempty" gorm:"not null;primary_key;auto_increment"` // 用户id
UserName string `protobuf:"bytes,2,req,name=user_name" json:"user_name,omitempty" gorm:"size:64;not null;unique" validate:"email"` //用户登录名
Name string `protobuf:"bytes,3,req,name=name" json:"name,omitempty" gorm:"size:64; not null"` // 用户名称
Password string `protobuf:"bytes,12,req,name=password" json:"password,omitempty" gorm:"size:128; not null"` //密码
}
AutoMigrate
AutoMigrate 会创建(新的)表、缺少的外键、约束、列和索引,并且会更改现有列的类型(如果其大小、精度、是否为空可更改的话)。但不会删除未使用的列,以保护现存的数据。
db.AutoMigrate(&model.User{})
创建
err := global.DB.Create(&model.User{
UserName: username,
Password: password,
Name: "用户" + username,
}).Error
if err != nil {
return 0, err
}
查询
这里就可以通过user.字段查询各种数据,如果查询的数据不止一个,则可以用user数组来装。
var user model.User
err := global.DB.Table(user.GetTableName()).Where("user_id = ?", id).First(&user).Error
if err != nil {
return dto.User{}, err
}
删除
删除一条记录时,删除对象需要指定主键,否则会批量删除
global.DB.Where("id = ?", 1).Delete(&user)