GORM中Model和Table的区别及使用

2025-03-28 15:50
文章标签 使用 区别 model table gorm

本文主要是介绍GORM中Model和Table的区别及使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《GORM中Model和Table的区别及使用》Model和Table是两种与数据库表交互的核心方法,但它们的用途和行为存在著差异,本文主要介绍了GORM中Model和Table的区别及使用,具有一...

在 GORM 中,Model 和 Table 是两种与数据库表交互的核心方法php,但它们的用途和行为存在显著差异。本文将深入探讨两者的区别,并通过代码示例帮助开发者理解如何在不同场景下选择合适的方法。

1. Model 的作用与特点

1.1 核心用途

Model 方法用于将 Go 结构体(Model)与数据库表进行关联。它隐式地基于结构体的定义推断表名、字段映射以及关系。

1.2 行为特点

• 自动表名解析
默认使用结构体名的复数形式作为表名(如 User → users),也可以通过 TableName() 方法自定义。

• 字段映射
结构体的字段通过标签(如 gorm:"column:user_name")与数据库列关联,查询时会自动转换命名风格(如驼峰→蛇形)。

• 链式方法集成js
后续的查询条件(如 Where)可以直接使用结构体的字段名,而非数据库列名。

• 模型钩子生效
若结构体实现了 BeforeSaveAfterFind 等钩子方法,操作时会自动触发。

1.3 示例代码

type User struct {
    ID   uint
    Name string `gorm:"column:username"`
}

// 自动对应 users 表,查询时使用结构体字段名
var user User
db.Model(&Userjavascript{}).Where("name = ?", "john").First(&编程user)
// SQL: SELECT * FROM users WHERE username = 'john' LIMIT 1;

2. Table 的作用与特点

2.1 核心用途

Table 方法直接指定数据库表名,适用于非结构化查询(如动态表名、复杂 Join)或未定义 Model 的场景。

2.2 行为特点

• 显式表名指定
直接使用传入的字符串作为表名,忽略模型定义。

• 原生列名操作
查询条件需使用数据库列名,而非结构体字段名。

• 无模型关联
不会触发模型钩子,也不依赖结构体的 TableName() 方法。

• 灵活性高
适合动态表名(如分表)或复杂 SQL 拼接。

2.3 示例代码

// 直接操作 users 表,需使用列名 username
var result map[string]interface{}
db.Table("users").Where("username = ?", "john").Find(&result)
// SQL: SELECT * FROM users WHERE username = 'john';

3. 对比总结

特性ModelTable
表名来源结构体推断或 TableName() 方法直接传入字符串
字段/列名映射自动转换(支持标签)需使用数据库列名
模型钩子生效不生效
动态表名需通过 TableName() 动态返回直接传入动态字符串(如分表场景)
适用场景结构化查询、关联操作原生 SQL、动态表名、复杂查询

4. 何时选择 Model 或 Table?

4.1 使用 Model 的场景

• 需要模型与表自动关联(如操作 CRUD)。
• 依赖结构体字段名自动生成查询条件。
• 需要触发钩子方法(如自动记录更新时间)。
• 进行关联查询(PreloadJoins)。

4.2 使用 Table 的场景

• 操作未定义 Model 的表。
• 动态表名(如按日期分表)。
• 执行复杂 SQL(如子查询、UNION)。
• 查询结果映射到 map 或非模型结构体。

5. 高级技巧

5.1 混合使用 Model 和 Table

// 使用 Model 定义字段映射,但重写表名
db.Model(&User{}).Table("admin_users").Find(&results)
// SQL: SELECT * FROM admin_users;

5.2 查询到非结构体类型

// 将结果扫描到 map 或切片
var userMap map[string]interface{}
db.Model(&User{}).First(&userMap)

var results []map[string]interface{}
db.Table("users").Find(&results)

6. 总结

Model 和 Table 是 GORM 中两种不同的表操作入口:
• Model 更适合结构化、模型驱动的场景,强调约定优于配置。
• Table 则提供更高的灵活性,适合动态需求或原生 SQL 操作。

根据实际需求选择合适的方法,可以显著提升代码的可维护性和执行效率。

到此这篇关于GORM中Model和Table的区别及使用的文章就介绍到这了,更多相关GORM Model Table区别内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于GORM中Model和Table的区别及使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153988

相关文章

MySQL 衍生表(Derived Tables)的使用

《MySQL衍生表(DerivedTables)的使用》本文主要介绍了MySQL衍生表(DerivedTables)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学... 目录一、衍生表简介1.1 衍生表基本用法1.2 自定义列名1.3 衍生表的局限在SQL的查询语句select

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

MySQL分区表的具体使用

《MySQL分区表的具体使用》MySQL分区表通过规则将数据分至不同物理存储,提升管理与查询效率,本文主要介绍了MySQL分区表的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、分区的类型1. Range partition(范围分区)2. List partition(列表分区)3. H

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau