注
GORM有个非常好用的点就是传递的字段为默认值时(""、0
create、update或where任何情况),GORM会自动忽略这一字段!!!
ORM
ORM:对象关系映射(Object Relational Mapping),将数据库中的表映射成程序中的对象!(它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 )
GORM开始(gorm.io/gorm
)
一、创建Model
数据库中创建表
CREATE TABLE users
(
id BIGINT AUTO_INCREMENT NOT NULL COMMENT '自增ID',
account VARCHAR(64) NOT NULL COMMENT '用户账号',
password VARCHAR(64) NOT NULL COMMENT '密码',
iphone VARCHAR(16) NOT NULL COMMENT '电话',
status TINYINT DEFAULT 1 NOT NULL COMMENT '用户状态:1:启用;2;禁用',
creator VARCHAR(64) NOT NULL COMMENT '创建者',
last_login BIGINT NULL COMMENT '最后一次登录时间',
update_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL COMMENT '最近更新时间',
create_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间',
PRIMARY KEY (id),
UNIQUE KEY uk_account (account),
KEY uk_status (iphone)
)
ENGINE = InnoDB
CHARSET = utf8
COMMENT = '用户表'
创建对应的struct
type User struct {
ID int64 `gorm:"column:id;primaryKey;auto_increment"` //则增主键
Account string `gorm:"column:account;unique;not null"` //用户账号
Password string `gorm:"column:password;not null"` //密码
Iphone string `gorm:"column:iphone;not null"` //电话
Status uint8 `gorm:"column:status;default:1;not null"` //用户状态:1:启用;2;禁用
Creator string `gorm:"column:creator;not null"` //创建者
LastLogin int64 `gorm:"column:last_login"` //最近一次登录时间点
UpdatedAt time.Time `gorm:"column:updated_at;default:CURRENT_TIMESTAMP;NOT NULL"` //最近更新时间
CreatedAt time.Time `gorm:"column:created_at;default:CURRENT_TIMESTAMP;NOT NULL"` //创建时间
}
二、连接数据库
注意:gorm.Config会自动给struct添加s再去数据库中查表(很贴心)
func Init() {
1.连接数据库
db, err := gorm.Open(mysql.New(mysql.Config{ //配置mysql
DSN: "root:@tcp(127.0.0.1:3306)/go?charset=utf8&parseTime=True&loc=Local", // DSN data source name
DefaultStringSize: 256, // string 类型字段的默认长度
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
}), &gorm.Config{ //配置gorm
DisableForeignKeyConstraintWhenMigrating: true,//禁止自动创建外键 (现在代码都是逻辑外键,数据库外键影响数据库性能)
Logger: logger.Default.LogMode(logger.Warn),//常常使用gorm默认日志 并设置日志级别
})
if err != nil {
log.Printf("[Mysql Connection] err: %+v",err)
}
2.获取连接的连接池并配置(底层还是由原生的sql.DB维护的连接池)
sqlDB, err := db.DB()
if err != nil {
log.Printf("%+v",err)
}
sqlDB.SetMaxIdleConns(10)// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxOpenConns(100)// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetConnMaxLifetime(time.Hour)// SetConnMaxLifetime 设置了连接可复用的最大时间。
3.将初始化好的DB对象复制给全局变量供使用
DefaultWriter = db
}
三、CURD【养成习惯:CURD都使用Model!】
gorm有个很好的特性,值为默认0值的数据不会存为数据,也不会作为条件!
Create
func CreateUser(u *User) error {
err := mysql.DefaultWriter.Model(&User{}).Create(u).Error
return err
}
func CreateUsers(us []*User) error {
err := mysql.DefaultWriter.Model(&User{}).Create(us).Error
return err
}
DB.Model(&User{}).Create(map[string]interface{}{
"Name": "jinzhu", "Age": 18,
})
// 根据 `[]map[string]interface{}{}` 批量插入
DB.Model(&User{}).Create([]map[string]interface{}{
{"Name": "jinzhu_1", "Age": 18},
{"Name": "jinzhu_2", "Age": 20},
})
Update
更新单列
db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
更新多列(使用map!保险一点)
// 根据新对象更新
mysql.DefaultReader.Model(&User{}).Where("status = ?",1).Updates(User{Iphone: "110","name": "hello", "age": 18, "actived": false})
// 根据 `map` 更新属性
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
注:筛选到的会全更新!
Scan/Find
Delete
mysql.DefaultWriter.Model(&User{}).Where(&User{Account:"t2"}).Delete(&User{})
注:其实可以不用model,因为Delete(&User{})