【Go】GORM手册(一)

GORM手册(一)

安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

通用模型

type User struct {
  Updated   int64 `gorm:"autoUpdateTime:nano"` // 使用时间戳纳秒数填充更新时间
  Updated   int64 `gorm:"autoUpdateTime:milli"` // 使用时间戳毫秒数填充更新时间
  Created   int64 `gorm:"autoCreateTime"`      // 使用时间戳秒数填充创建时间
}

连接数据库

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func main() {
    dbLogger := logger.New(
        log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
        logger.Config{
            SlowThreshold: time.Second, // 慢 SQL 阈值
            LogLevel:      logger.Info, // Log level
            Colorful:      false,       // 禁用彩色打印
        },
    )

    dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
        SkipDefaultTransaction: true, // 关闭默认事务
        CreateBatchSize:        1000, // 批量插入1000
        Logger:                 dbLogger,
    })
}

字段映射

  • 表名映射(默认是struct名的复数)

// 方式1,推荐
db.Table("user").CreateTable(&YourStruct{})
// 方式2
func (User) TableName() string {
    return "user"
}
// 方式3,不推荐,Model引入的字段不好控制
type User struct {
    gorm.Model `gorm:"table:user"`
}
  • 字段映射

// 数据库对应表字段与golang语言中定义的结构体变量不一致时,需要使用指定映射关系
type Person struct {
    Id         int    `gorm:"column:id"`
}

创建记录

  • 常用创建
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
result := db.Create(&user) // 通过数据的指针来创建

user.ID             // 返回插入数据的主键
result.Error        // 返回 error
result.RowsAffected // 返回插入记录的条数
  • 指定字段插入
db.Select("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`name`,`age`,`created_at`) VALUES ("jinzhu", 18, "2020-07-04 11:05:21.775")
  • 忽略字段插入
db.Omit("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`birthday`,`updated_at`) VALUES ("2020-01-01 00:00:00.000", "2020-07-04 11:05:21.775")

批量插入

要有效地插入大量记录,请将一个 slice 传递给 Create 方法。 GORM 将生成单独一条SQL语句来插入所有数据,并回填主键的值,钩子方法也会被调用。

var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}
db.Create(&users)

for _, user := range users {
  user.ID // 1,2,3
}

使用 CreateInBatches 分批创建时,你可以指定每批的数量,例如:

var users = []User{{name: "jinzhu_1"}, ...., {Name: "jinzhu_10000"}}

// 数量为 100
db.CreateInBatches(users, 100)

也可以使用CreateBatchSize初始化GORM,所有的创建Create都会遵循批量插入

db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
  CreateBatchSize: 1000,
})

users = [5000]User{{Name: "jinzhu", Pets: []Pet{pet1, pet2, pet3}}...}
db.Create(&users)

查询

// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;

// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;

// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;

result := db.First(&user)
result.RowsAffected // 返回找到的记录数
result.Error        // returns error or nil

// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)

Where语句

Where("status=? AND version=?", 11, "d12")
Where("id in ?", []int{1,2})

Update语句

Update("status", 11)

Updates语句

Updates(map[string]interface{}{
    "status": 12,
    "version": "d13",
})
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • orm orm 全称 object relation mapping 对象映射关系,目的是解决面向对象和关系数据库...
    JarAlreadyTaken阅读 26,298评论 1 11
  • 胖sir :接着,给你一个馅饼儿 兵长 : 来嘞!!一篇来自ORM的整理笔记... 1 什么是ORM?为什么要⽤O...
    阿兵云原生阅读 192评论 0 1
  • gorm的使用 gorm的安装 打开go运行的文件夹下的终端,创建main.go文件 执行下面的指令初始化mod ...
    Lyi_Zri阅读 700评论 0 0
  • 今天是公元2021年3月30日,坊间流传PHP的git服务器被黑客攻入,因恶意代码服务器将关停,PHP还是世界上最...
    王中阳阅读 696评论 0 1
  • Gorm 是一款 ORM 框架,当我们想把一个对象/struct 持久化的时候,我们可以直接操作对象/struct...
    CocoAdapter阅读 9,365评论 0 0