GORM快速开始

GORM有个非常好用的点就是传递的字段为默认值时(""、0create、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{})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值