首页 > 其他分享 >go语言Gin框架的学习路线(八)

go语言Gin框架的学习路线(八)

时间:2024-07-22 23:01:05浏览次数:8  
标签:框架 db GORM User 表名 go Gin Model gorm

目录

GORM Model定义

使用 Model 结构体的自定义数据模型

理解并记忆 GORM 的 Model 结构体可以通过以下几个步骤和技巧:

1. 理解基本概念

2. 熟悉基本字段

3. 记忆技巧

4. 使用场景

结构体标记

支持的结构体标记(Struct tags)

关联相关标记(tags)

GROM(默认行为)主键、表名的约定

主键(Primary Key)

表名(Table Name)

也可以通过Table()指定表名:

GORM还支持更改默认表名称规则:

示例应用场景:

时间戳跟踪

CreatedAt

UpdatedAt

DeletedAt


GORM Model定义(基于七米老师)

GORM 的 Model 是一个内嵌的结构体,它提供了一组通用的模型字段和方法,使得在定义你的数据模型时更加方便和一致。

GORM 的 Model 结构体通常定义如下:

type Model struct {
    ID        uint
    CreatedAt time.Time `gorm:"column:create_at"`
    UpdatedAt time.Time `gorm:"column:update_at"`
    DeletedAt gorm.DeletedAt `gorm:"column:deleted_at"`
}
  • ID 是一个自增的主键。
  • CreatedAt 和 UpdatedAt 是记录创建和更新时间的时间戳字段。
  • DeletedAt 是一个用于软删除的字段(如果使用软删除功能)。

使用 Model 结构体的自定义数据模型

以下是如何在自定义数据模型中使用 Model 结构体(你可以将它嵌入到你自己的模型中)的示例:

package main

import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
    "log"
    "time"
)

// Model 是 GORM 的基础模型,内嵌在其他模型中
type Model struct {
    ID        uint
    CreatedAt time.Time `gorm:"column:create_at"`
    UpdatedAt time.Time `gorm:"column:update_at"`
    DeletedAt gorm.DeletedAt `gorm:"column:deleted_at"`
}

// User 定义了一个用户模型,内嵌了 GORM 的 Model 结构体
type User struct {
    Model     // 内嵌 Model 以获得通用字段
    Name      string
    Age       int
    Email     string
}

func main() {
    // 连接到 SQLite 数据库,实际使用中可能连接到 MySQL、PostgreSQL 等
    dsn := "file:db.sqlite?mode=memory&cache=shared&_fk=1"
    db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal(err)
    }

    // 自动迁移数据库模式
    db.AutoMigrate(&User{})

    // 创建新用户
    user := User{Name: "Alice", Age: 30, Email: "[email protected]"}
    db.Create(&user)

    // 查询用户
    var users []User
    db.Find(&users)
    log.Println(users)

    // 更新用户信息
    db.Model(&User{Name: "Alice"}).Updates(User{Age: 31})

    // 删除用户
    db.Delete(&User{Name: "Alice"}, &User{})
}

在这个示例中:

  • Model 结构体定义了一组通用字段,如 IDCreatedAtUpdatedAt 和 DeletedAt
  • User 结构体内嵌了 Model,从而自动获得了这些通用字段。
  • 使用 AutoMigrate 方法自动创建数据库表,确保表结构与 User 结构体一致。
  • 使用 Create 方法添加新用户。
  • 使用 Find 方法查询用户。
  • 使用 Model 方法和 Updates 来更新用户信息。
  • 使用 Delete 方法删除用户。

这样,你就可以在你的应用程序中方便地使用 GORM 的 Model 结构体来简化数据库操作。

理解并记忆 GORM 的 Model 结构体可以通过以下几个步骤和技巧:

1. 理解基本概念

  • ORM: 对象关系映射,允许你使用面向对象的方式来操作数据库。
  • Model: GORM 中的 Model 是一个内嵌结构体,提供了数据库操作的通用字段和行为。

2. 熟悉基本字段

  • ID: 主键,通常用于唯一标识数据库记录。
  • CreatedAt: 创建时间,记录记录被创建的时间。
  • UpdatedAt: 更新时间,记录记录最后被更新的时间。
  • DeletedAt: 软删除时间,用于实现软删除功能。

3. 记忆技巧

  • 首字母法: 记住字段的首字母,如 I (ID), C (CreatedAt), U (UpdatedAt), D (DeletedAt).
  • 关联记忆: 将字段与实际的数据库操作关联起来,比如 CreatedAt 与记录的创建时间关联。

4. 使用场景

  • 定义模型: 在定义你的数据模型时,通常会内嵌 Model 结构体。
  • 自动字段: 内嵌 Model 后,你的模型会自动获得 IDCreatedAtUpdatedAt 等字段

结构体标记

使用结构体声明模型时,标记(tags)是可选项。gorm支持以下标记:

支持的结构体标记(Struct tags)
结构体标记(Tag)描述
Column指定列名
Type指定列数据类型
Size指定列大小, 默认值255
PRIMARY_KEY将列指定为主键
UNIQUE将列指定为唯一
DEFAULT指定列默认值
PRECISION指定列精度
NOT NULL将列指定为非 NULL
AUTO_INCREMENT指定列是否为自增类型
INDEX创建具有或不带名称的索引, 如果多个索引同名则创建复合索引
UNIQUE_INDEX和 INDEX 类似,只不过创建的是唯一索引
EMBEDDED将结构设置为嵌入
EMBEDDED_PREFIX设置嵌入结构的前缀
-忽略此字段
关联相关标记(tags)
结构体标记(Tag)描述
MANY2MANY指定连接表
FOREIGNKEY设置外键
ASSOCIATION_FOREIGNKEY设置关联外键
POLYMORPHIC指定多态类型
POLYMORPHIC_VALUE指定多态值
JOINTABLE_FOREIGNKEY指定连接表的外键
ASSOCIATION_JOINTABLE_FOREIGNKEY指定连接表的关联外键
SAVE_ASSOCIATIONS是否自动完成 save 的相关操作
ASSOCIATION_AUTOUPDATE是否自动完成 update 的相关操作
ASSOCIATION_AUTOCREATE是否自动完成 create 的相关操作
ASSOCIATION_SAVE_REFERENCE是否自动完成引用的 save 的相关操作
PRELOAD是否自动完成预加载的相关操作

GROM(默认行为)主键、表名的约定

主键(Primary Key)

GORM 默认会使用名为ID的字段作为表的主键。

type User struct {
  ID   string // 名为`ID`的字段会默认作为表的主键
  Name string
}

// 使用`AnimalID`作为主键
type Animal struct {
  AnimalID int64 `gorm:"primary_key"`
  Name     string
  Age      int64
}

 

表名(Table Name)

表名默认就是结构体名称的复数,例如:

package main

import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
    "log"
)

// User 定义了一个用户模型
type User struct {
    gorm.Model
    Name  string
    Age   int
    Email string
}

func main() {
    // 连接到 SQLite 数据库
    dsn := "file:db.sqlite?mode=memory&cache=shared&_fk=1"
    db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal(err)
    }

    // 自动迁移数据库模式
    db.AutoMigrate(&User{})

    // 创建新用户
    user := User{Name: "Alice", Age: 30, Email: "[email protected]"}
    db.Create(&user)

    // 查询用户
    var users []User
    db.Find(&users)
    log.Println(users)
}

在这个例子中:

  • User 结构体定义了一个用户模型,内嵌了 gorm.Model 以获得通用字段。
  • 表名默认为 "users",因为 GORM 将 "User" 自动转换为复数形式。
  • 使用 AutoMigrate 方法自动创建数据库表,确保表结构与 User 结构体一致。
  • 使用 Create 方法添加新用户。
  • 使用 Find 方法查询用户。

这样,你就可以看到 GORM 如何自动处理表名的生成。

禁用默认表名的复数形式,如果置为 true,则 `User` 的默认表名是 `user`

db.SingularTable(true)
也可以通过Table()指定表名:
// 使用User结构体创建名为`deleted_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';

这段代码展示了 GORM 提供的灵活性,允许你通过 Table 方法指定表名,而不是依赖 GORM 自动推断的表名。这对于需要使用特定表名或已经存在的表名与 GORM 模型名称不匹配的情况非常有用。 

GORM还支持更改默认表名称规则:
gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string  {
  return "prefix_" + defaultTableName;
}

这段代码是 GORM 的一个配置示例,用于自定义表名的生成规则。GORM 允许你通过设置 gorm.DefaultTableNameHandler 来改变表名的默认生成逻辑。下面是对代码的详细解释:

  • gorm.DefaultTableNameHandler: 这是一个全局变量,它是一个函数,用于处理和生成表名。

  • 函数签名 func(db *gorm.DB, defaultTableName string) string: 这个函数接收两个参数,第一个是 *gorm.DB 类型的 db,表示当前的数据库连接实例;第二个是 defaultTableName 字符串,表示 GORM 根据模型名称自动生成的默认表名。函数返回一个字符串,即自定义后的表名。

  • return "prefix_" + defaultTableName: 这个函数的实现非常简单,它将为所有自动生成的表名添加前缀 "prefix_"。例如,如果模型名称是 User,GORM 默认会生成表名为 "users",使用这个函数后,表名将变为 "prefix_users"

示例应用场景:

假设你有一个数据库,所有表都遵循特定的命名规范,比如都以 "app_" 作为前缀。你可以设置 gorm.DefaultTableNameHandler 来确保所有模型都遵循这个规范:

时间戳跟踪

CreatedAt

如果模型有 CreatedAt字段,该字段的值将会是初次创建记录的时间。

db.Create(&user) // `CreatedAt`将会是当前时间

// 可以使用`Update`方法来改变`CreateAt`的值
db.Model(&user).Update("CreatedAt", time.Now())
UpdatedAt

如果模型有UpdatedAt字段,该字段的值将会是每次更新记录的时间。

db.Save(&user) // `UpdatedAt`将会是当前时间

db.Model(&user).Update("name", "jinzhu") // `UpdatedAt`将会是当前时间
DeletedAt

如果模型有DeletedAt字段,调用Delete删除该记录时,将会设置DeletedAt字段为当前时间,而不是直接将记录从数据库中删除。

 

期末放假自学Gin框架,希望我们可以一起学习!

标签:框架,db,GORM,User,表名,go,Gin,Model,gorm
From: https://blog.csdn.net/juzihuaile/article/details/140620603

相关文章

  • vue项目打包以及在nginx中部署
    ——————vue项目打包点击npm脚本下的build中的三角即可没有npm脚本的话点下package.json,还没有的参考博客https://www.cnblogs.com/yansans/p/18303172 稍微等一会,打包完成后数据会放在新生成的dist目录中  打包结束  ——————在nginx中部署在文件夹......
  • 接口自动化测试框架实战-0-项目功能概览
    熟悉我CSDN的朋友们应该知道,之前已经更新了requests、pytest、allure2、yaml、jenkins、postman等基础知识的合集。相信大家对接口测试已经有了全面的认识,现在应该迫不及待地想要一个实战项目了。接下来的文章中,我们将把这些知识点串联起来,以钉钉开放接口为例,一起从0到1开发一......
  • Django 入门指南:从环境设置到创建第一个应用程序
    简介Django是一个流行的PythonWeb框架,用于快速开发强大的Web应用程序。本指南将带你从安装Django开始,逐步学习如何创建一个简单的Django项目和应用程序。步骤1:准备环境首先,确保你的开发环境中安装了Python,并了解如何使用虚拟环境来管理项目依赖。安装虚拟......
  • 登陆京东(滑块验证),验证码识别,Scrapy框架介绍及其使用,持久化存储到本地
    Ⅰ案例登陆京东(滑块验证)【一】下载opencv库pipinstallopencv-python【二】数据准备先将京东的滑块图片下载到本地背景图background.png滑块图tag.png【三】展示获取滑块的移动数据importos.path#使用opencv识别图像计算滑块之间的距离importcv2impo......
  • keepalived+nginx实现负载均衡
    1、安装keepalived(源码编译安装)wgethttps://www.keepalived.org/software/keepalived-2.3.0.tar.gztar-zxfkeepalived-2.3.0.tar.gzcdkeepalived-2.3.0&&  mkdir/data01/keepalived&& ./configure--prefix=/data01/keepalived&&make-j4&&......
  • AtCoder Beginner Contest 363
    AtCoderBeginnerContest363PilingUp模拟题。点击查看代码#include<bits/stdc++.h>usingnamespacestd;inta;signedmain(){cin>>a;if(a%100!=0){a%=100;cout<<100-a;}else{cout<<100;}retur......
  • MySQL Architecture And Engine
    Author:ACatSmilingSince:2024-07-22SELECT的执行过程SELECT的查询结构方式一:SELECT...,...,...FROM...,...,...WHERE多表的连接条件AND不包含组函数的过滤条件GROUPBY...,...HAVING包含组函数的过滤条件ORDERBY...ASC/DESCLIMIT...,...;方式二......
  • 【Golang 面试基础题】每日 5 题(三)
    ✍个人博客:Pandaconda-CSDN博客......
  • Prompt Enginnering(提示工程)
    什么是提示工程promptenginnering是提示工程的意思,也有叫指令工程。用白话讲:是我们对GPT说出的话,我们向它提问的信息,就是prompt。官方一点:是我们使用自然语言提示来控制和优化生成式模型(生成式模型例如:OpenAi的GPT-3,GPT-4o)输出的一项技术。对prompt进行优化,可以使我们从生......
  • BootStrap框架的使用
    一、下载:BootStrap是一套用于HTML、CSS和JS开发的开源工具集。BootStrap下载官网学习的初级阶段,这里下载生产文件即可将下载的压缩包解压得到包含以下的文件:记住bootstrap.min.css文件的路径创建html骨架,link引入bootstrap.min.css文件可根据文档中的代码复制到htm......