亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

GORM中Model和Table的區(qū)別及使用

 更新時(shí)間:2025年03月28日 10:32:27   作者:好奇的菜鳥  
Model?和Table是兩種與數(shù)據(jù)庫表交互的核心方法,但它們的用途和行為存在著差異,本文主要介紹了GORM中Model和Table的區(qū)別及使用,具有一定的參考價(jià)值,感興趣的可以了解一下

在 GORM 中,Model 和 Table 是兩種與數(shù)據(jù)庫表交互的核心方法,但它們的用途和行為存在顯著差異。本文將深入探討兩者的區(qū)別,并通過代碼示例幫助開發(fā)者理解如何在不同場(chǎng)景下選擇合適的方法。

1. Model 的作用與特點(diǎn)

1.1 核心用途

Model 方法用于將 Go 結(jié)構(gòu)體(Model)與數(shù)據(jù)庫表進(jìn)行關(guān)聯(lián)。它隱式地基于結(jié)構(gòu)體的定義推斷表名、字段映射以及關(guān)系。

1.2 行為特點(diǎn)

• 自動(dòng)表名解析
默認(rèn)使用結(jié)構(gòu)體名的復(fù)數(shù)形式作為表名(如 User → users),也可以通過 TableName() 方法自定義。

• 字段映射
結(jié)構(gòu)體的字段通過標(biāo)簽(如 gorm:"column:user_name")與數(shù)據(jù)庫列關(guān)聯(lián),查詢時(shí)會(huì)自動(dòng)轉(zhuǎn)換命名風(fēng)格(如駝峰→蛇形)。

• 鏈?zhǔn)椒椒?/strong>:
后續(xù)的查詢條件(如 Where)可以直接使用結(jié)構(gòu)體的字段名,而非數(shù)據(jù)庫列名。

• 模型鉤子生效
若結(jié)構(gòu)體實(shí)現(xiàn)了 BeforeSaveAfterFind 等鉤子方法,操作時(shí)會(huì)自動(dòng)觸發(fā)。

1.3 示例代碼

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

// 自動(dòng)對(duì)應(yīng) users 表,查詢時(shí)使用結(jié)構(gòu)體字段名
var user User
db.Model(&User{}).Where("name = ?", "john").First(&user)
// SQL: SELECT * FROM users WHERE username = 'john' LIMIT 1;

2. Table 的作用與特點(diǎn)

2.1 核心用途

Table 方法直接指定數(shù)據(jù)庫表名,適用于非結(jié)構(gòu)化查詢(如動(dòng)態(tài)表名、復(fù)雜 Join)或未定義 Model 的場(chǎng)景。

2.2 行為特點(diǎn)

• 顯式表名指定
直接使用傳入的字符串作為表名,忽略模型定義。

• 原生列名操作
查詢條件需使用數(shù)據(jù)庫列名,而非結(jié)構(gòu)體字段名。

• 無模型關(guān)聯(lián)
不會(huì)觸發(fā)模型鉤子,也不依賴結(jié)構(gòu)體的 TableName() 方法。

• 靈活性高
適合動(dòng)態(tài)表名(如分表)或復(fù)雜 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. 對(duì)比總結(jié)

特性ModelTable
表名來源結(jié)構(gòu)體推斷或 TableName() 方法直接傳入字符串
字段/列名映射自動(dòng)轉(zhuǎn)換(支持標(biāo)簽)需使用數(shù)據(jù)庫列名
模型鉤子生效不生效
動(dòng)態(tài)表名需通過 TableName() 動(dòng)態(tài)返回直接傳入動(dòng)態(tài)字符串(如分表場(chǎng)景)
適用場(chǎng)景結(jié)構(gòu)化查詢、關(guān)聯(lián)操作原生 SQL、動(dòng)態(tài)表名、復(fù)雜查詢

4. 何時(shí)選擇 Model 或 Table?

4.1 使用 Model 的場(chǎng)景

• 需要模型與表自動(dòng)關(guān)聯(lián)(如操作 CRUD)。
• 依賴結(jié)構(gòu)體字段名自動(dòng)生成查詢條件。
• 需要觸發(fā)鉤子方法(如自動(dòng)記錄更新時(shí)間)。
• 進(jìn)行關(guān)聯(lián)查詢(Preload、Joins)。

4.2 使用 Table 的場(chǎng)景

• 操作未定義 Model 的表。
• 動(dòng)態(tài)表名(如按日期分表)。
• 執(zhí)行復(fù)雜 SQL(如子查詢、UNION)。
• 查詢結(jié)果映射到 map 或非模型結(jié)構(gòu)體。

5. 高級(jí)技巧

5.1 混合使用 Model 和 Table

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

5.2 查詢到非結(jié)構(gòu)體類型

// 將結(jié)果掃描到 map 或切片
var userMap map[string]interface{}
db.Model(&User{}).First(&userMap)

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

6. 總結(jié)

Model 和 Table 是 GORM 中兩種不同的表操作入口:
• Model 更適合結(jié)構(gòu)化、模型驅(qū)動(dòng)的場(chǎng)景,強(qiáng)調(diào)約定優(yōu)于配置。
• Table 則提供更高的靈活性,適合動(dòng)態(tài)需求或原生 SQL 操作。

根據(jù)實(shí)際需求選擇合適的方法,可以顯著提升代碼的可維護(hù)性和執(zhí)行效率。

到此這篇關(guān)于GORM中Model和Table的區(qū)別及使用的文章就介紹到這了,更多相關(guān)GORM Model Table區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言時(shí)間管理利器之深入解析time模塊的實(shí)戰(zhàn)技巧

    Go語言時(shí)間管理利器之深入解析time模塊的實(shí)戰(zhàn)技巧

    本文深入解析了Go語言標(biāo)準(zhǔn)庫中的time模塊,揭示了其高效用法和實(shí)用技巧,通過學(xué)習(xí)time模塊的三大核心類型(Time、Duration、Timer/Ticker)以及高頻使用場(chǎng)景,開發(fā)者可以更好地處理時(shí)間相關(guān)的任務(wù),感興趣的朋友一起看看吧
    2025-03-03
  • Golang橋接模式講解和代碼示例

    Golang橋接模式講解和代碼示例

    橋接是一種結(jié)構(gòu)型設(shè)計(jì)模式,可將業(yè)務(wù)邏輯或一個(gè)大類拆分為不同的層次結(jié)構(gòu),從而能獨(dú)立地進(jìn)行開發(fā),本文將通過代碼示例詳細(xì)給大家介紹一下Golang橋接模式,需要的朋友可以參考下
    2023-06-06
  • go語言編程實(shí)現(xiàn)遞歸函數(shù)示例詳解

    go語言編程實(shí)現(xiàn)遞歸函數(shù)示例詳解

    這篇文章主要為大家介紹了go語言編程實(shí)現(xiàn)遞歸函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • golang實(shí)現(xiàn)協(xié)程池的方法示例

    golang實(shí)現(xiàn)協(xié)程池的方法示例

    本文主要介紹了golang實(shí)現(xiàn)協(xié)程池的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • 詳解Go如何優(yōu)雅的對(duì)時(shí)間進(jìn)行格式化

    詳解Go如何優(yōu)雅的對(duì)時(shí)間進(jìn)行格式化

    這篇文章主要為大家詳細(xì)介紹了Go語言中是如何優(yōu)雅的對(duì)時(shí)間進(jìn)行格式化的,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-06-06
  • Go設(shè)計(jì)模式之觀察者模式圖解

    Go設(shè)計(jì)模式之觀察者模式圖解

    觀察者模式是一種行為設(shè)計(jì)模式, 允許你定義一種訂閱機(jī)制, 可在對(duì)象事件發(fā)生時(shí)通知多個(gè) “觀察” 該對(duì)象的其他對(duì)象,下面這篇文章主要給大家介紹了關(guān)于圖解Go觀察者模式的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • Golang讀寫二進(jìn)制文件方法總結(jié)

    Golang讀寫二進(jìn)制文件方法總結(jié)

    使用?Golang?的?encoding/gob?包讀寫二進(jìn)制文件非常方便,而且代碼量也非常少,本文就來通過兩個(gè)示例帶大家了解一下encoding/gob的具體用法吧
    2023-05-05
  • 如何在VScode 中編譯多個(gè)Go文件

    如何在VScode 中編譯多個(gè)Go文件

    這篇文章主要介紹了VScode 中編譯多個(gè)Go文件的實(shí)現(xiàn)方法,本文通過實(shí)例圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • Golang使用gzip壓縮字符減少redis等存儲(chǔ)占用的實(shí)現(xiàn)

    Golang使用gzip壓縮字符減少redis等存儲(chǔ)占用的實(shí)現(xiàn)

    本文主要介紹了Golang使用gzip壓縮字符減少redis等存儲(chǔ)占用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • golang定時(shí)器和超時(shí)的使用詳解

    golang定時(shí)器和超時(shí)的使用詳解

    這篇文章主要介紹了golang定時(shí)器和超時(shí)的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評(píng)論