gorm 教程 一(1)

简介: gorm 教程 一

入门

模型定义

模型一般都是普通的 Golang 的结构体,Go的基本数据类型,或者指针。sql.Scanner 和 driver.Valuer,同时也支持接口。

例子:

type User struct {
  gorm.Model
  Name         string
  Age          sql.NullInt64
  Birthday     *time.Time
  Email        string  `gorm:"type:varchar(100);unique_index"`
  Role         string  `gorm:"size:255"` //设置字段的大小为255个字节
  MemberNumber *string `gorm:"unique;not null"` // 设置 memberNumber 字段唯一且不为空
  Num          int     `gorm:"AUTO_INCREMENT"` // 设置 Num字段自增
  Address      string  `gorm:"index:addr"` // 给Address 创建一个名字是  `addr`的索引
  IgnoreMe     int     `gorm:"-"` //忽略这个字段
}

惯例

我们要记住惯例大于配置,

gorm.Model

gorm.Model 是一个包含一些基本字段的结构体, 包含的字段有 ID,CreatedAt, UpdatedAt, DeletedAt。

你可以用它来嵌入到你的模型中,或者也可以用它来建立自己的模型。

// gorm.Model 定义
type Model struct {
  ID        uint `gorm:"primary_key"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt *time.Time
}
// 将字段 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt` 注入到 `User` 模型中
type User struct {
  gorm.Model
  Name string
}
// 声明 gorm.Model 模型
type User struct {
  ID   int
  Name string
}

ID 作为主键

GORM 默认使用 ID 作为主键名。

type User struct {
  ID   string // 字段名 `ID` 将被作为默认的主键名
}
// 设置字段 `AnimalID` 为默认主键
type Animal struct {
  AnimalID int64 `gorm:"primary_key"`
  Name     string
  Age      int64
}

复数表名

表名是结构体名称的复数形式

type User struct {} // 默认的表名是 `users`
// 设置 `User` 的表名为 `profiles`
func (User) TableName() string {
  return "profiles"
}
func (u User) TableName() string {
    if u.Role == "admin" {
        return "admin_users"
    } else {
        return "users"
    }
}
// 如果设置禁用表名复数形式属性为 true,`User` 的表名将是 `user`
db.SingularTable(true)

指定表名

// 用 `User` 结构体创建 `delete_users` 表
db.Table("deleted_users").CreateTable(&User{})
var deleted_users []User
db.Table("deleted_users").Find(&deleted_users)
 SELECT * FROM deleted_users;
db.Table("deleted_users").Where("name = ?", "jinzhu").Delete()
 DELETE FROM deleted_users WHERE name = 'jinzhu';

修改默认表名

你可以通过定义 DefaultTableNameHandler 字段来对表名使用任何规则。

gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string  {
    return "prefix_" + defaultTableName;
}

蛇形列名

列名是字段名的蛇形小写形式

type User struct {
  ID        uint      // 字段名是 `id`
  Name      string    // 字段名是 `name`
  Birthday  time.Time // 字段名是 `birthday`
  CreatedAt time.Time // 字段名是 `created_at`
}
// 重写列名
type Animal struct {
    AnimalId    int64     `gorm:"column:beast_id"`         // 设置列名为 `beast_id`
    Birthday    time.Time `gorm:"column:day_of_the_beast"` // 设置列名为 `day_of_the_beast`
    Age         int64     `gorm:"column:age_of_the_beast"` // 设置列名为 `age_of_the_beast`
}

时间戳跟踪

CreatedAt

对于有 CreatedAt 字段的模型,它将被设置为首次创建记录的当前时间。

db.Create(&user) // 将设置 `CreatedAt` 为当前时间
// 你可以使用 `Update` 方法来更改默认时间
db.Model(&user).Update("CreatedAt", time.Now())

Up datedAt

对于有 UpdatedAt 字段的模型,它将被设置为记录更新时的当前时间。

db.Save(&user) // 将设置 `UpdatedAt` 为当前时间
db.Model(&user).Update("name", "jinzhu") // 将设置 `UpdatedAt` 为当前时间

DeletedAt

对于有 DeletedAt 字段的模型,当删除它们的实例时,它们并没有被从数据库中删除,只是将 DeletedAt 字段设置为当前时间。

CRUD接口

创建

创建记录

user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
db.NewRecord(user) // => 返回 `true` ,因为主键为空
db.Create(&user)
db.NewRecord(user) // => 在 `user` 之后创建返回 `false`

默认值

你可以通过标签定义字段的默认值,例如:

type Animal struct {
    ID   int64
    Name string `gorm:"default:'galeone'"`
    Age  int64
}-

然后 SQL 会排除那些没有值或者有 零值 的字段,在记录插入数据库之后,gorm将从数据库中加载这些字段的值。

var animal = Animal{Age: 99, Name: ""}
db.Create(&animal)
// INSERT INTO animals("age") values('99');
// SELECT name from animals WHERE ID=111; // 返回的主键是 111
// animal.Name => 'galeone'

注意 所有包含零值的字段,像 0,’’,false 或者其他的 零值 不会被保存到数据库中,但会使用这个字段的默认值。你应该考虑使用指针类型或者其他的值来避免这种情况:

// Use pointer value
type User struct {
  gorm.Model
  Name string
  Age  *int `gorm:"default:18"`
}
// Use scanner/valuer
type User struct {
  gorm.Model
  Name string
  Age  sql.NullInt64 `gorm:"default:18"`
}

在钩子中设置字段值

如果你想在 BeforeCreate 函数中更新字段的值,应该使用 scope.SetColumn,例如:

func (user *User) BeforeCreate(scope *gorm.Scope) error {
  scope.SetColumn("ID", uuid.New())
  return nil
}

创建额外选项

// 为插入 SQL 语句添加额外选项
db.Set("gorm:insert_option", "ON CONFLICT").Create(&product)
// INSERT INTO products (name, code) VALUES ("name", "code") ON CONFLICT;

查询

查询

// 获取第一条记录,按主键排序
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;
// 获取所有的记录
db.Find(&users)
 SELECT * FROM users;
// 通过主键进行查询 (仅适用于主键是数字类型)
db.First(&user, 10)
 SELECT * FROM users WHERE id = 10;


gorm 教程 一(2)https://developer.aliyun.com/article/1391736

相关文章
|
5天前
|
安全 程序员 API
GORM概述
GORM概述
30 0
|
5天前
|
SQL 数据库 索引
gorm普通的增删改查
gorm普通的增删改查
33 0
|
SQL 关系型数据库 MySQL
gin框架学习-Gorm入门指南
Snake Case命名风格,就是各个单词之间用下划线(_)分隔,首字母大写区分一个单词,例如: CreateTime的Snake Case风格命名为create_time
303 0
gin框架学习-Gorm入门指南
|
9月前
|
前端开发 Go API
Day08:GORM快速入门07 has many| 青训营
Day08:GORM快速入门07 has many| 青训营
44 0
|
5天前
|
SQL 数据库
GORM—查
GORM—查
37 0
|
5天前
|
SQL 数据库
|
5天前
|
5天前
|
SQL 数据库
gorm 教程 一(3)
gorm 教程 一
69 0
|
5天前
|
数据库
gorm 教程 一(2)
gorm 教程 一
49 0
|
7月前
|
SQL 安全 数据库
GORM V2 写操作
GORM V2 写操作
31 0