GORM相关操作 | 青训营

65 阅读1分钟

安装

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)