Golang中GROM多表關聯跟原生SQL多表關聯區別

文章目錄

  • 前言
  • 一、GROM多表關聯
  • 二、原生Sql多表關聯


前言

  • 對比GROM多表關聯和原生Sql多表關聯

一、GROM多表關聯

  1. 適用于返回全部數據
  2. 需要邏輯外鍵(不會在數據庫創建任何約束)
  3. 適合三個表以下的關聯
  4. 有幾張表就會查詢幾次

type Product struct {gorm.Model           // 包含ID, CreatedAt, UpdatedAt, DeletedAtCateID       uint    `gorm:"not null;index:idx_cate_id" json:"cate_id"`          // 普通索引TagID        string  `gorm:"size:255;not null;index:idx_tag_id" json:"tag_id"`   // 多標簽字符串存儲,如"1,2,3"Name         string  `gorm:"size:255;not null;uniqueIndex:idx_name" json:"name"` // 唯一索引Sku          string  `gorm:"size:50;not null;uniqueIndex:idx_sku" json:"sku"`    // 唯一索引Price        float64 `gorm:"type:decimal(10,2);not null;default:0.00" json:"price"`Stock        int     `gorm:"not null;default:0" json:"stock"`StockWarning int     `gorm:"not null;default:0" json:"stock_warning"`CostPrice    float64 `gorm:"type:decimal(10,2);not null;default:0.00;" json:"cost_price"`Status       int8    `gorm:"type:tinyint;not null;default:1;index:idx_status" json:"status"` // 普通索引Description  *string `gorm:"type:text" json:"description"`ImageUrl     *string `gorm:"size:255" json:"image_url"`Unit         string  `gorm:"size:255;not null" json:"unit"`// 🔗 關聯關系:多對一 (多個商品屬于一個分類)// 🔗 關聯關系:多對一 (多個商品屬于一個分類)// 邏輯外鍵 不會同步到數據庫中,僅在此模型或項目內使用Category OrderCate `gorm:"foreignKey:CateID" json:"category"`
}//GROM示例
// 查詢商品及其分類信息(GORM聯查)
func GetProduvtWithCategroy(id uint) (*Product , error){var product Product// 步驟1. First(&product) 先根據id查詢商品表,獲取到producr.CateID// 步驟2. Preload("Category"),再根據獲取到的分類id查詢分類表,獲取到分類信息后返回到Category字段// 合并結果,將分類信息填充到 product.Category字段result := DB.Preload("Category").Where("id = ?" , id).First(&product)return &product, result.Error
}

二、原生Sql多表關聯

  1. 適用于三個表以上關聯
  2. 只查詢一次
  3. 適用于返回精準字段

// 商品列表結果結構體(用于API返回)
type ProductListResult struct {ID           uint    `json:"id"`Name         string  `json:"name"`Price        float64 `json:"price"`Stock        int     `json:"stock"`Status       int8    `json:"status"`CateID       uint    `json:"cate_id"`CategoryName string  `json:"category_name"`ImageUrl     *string `json:"image_url"`
}// 一方面減少查詢次數,一方面精準控制返回字段// 步驟1. FROM products p; 查詢商品表 p為表代號
// 步驟2.  LEFT JOIN products_cate c ON p.cate_id  = c.id;左連接分類表(根據cate_id關聯分類表主鍵id,左連接保證即使分類表中沒有對應記錄,商品信息也能顯示)
// 步驟3. WHERE p.deleted_at IS NULL 過濾已刪除的商品
// 步驟4. ORDER BY p.created_at DESC 按創建時間倒序排序
// 步驟5. SELECT  查詢指定字段, COALESCE:判斷字段是否為空,如果為空則返回默認值
// 步驟6. LIMIT 10 OFFSET 0 分頁查詢,每頁10條,從第0條開始
// 步驟7. Raw() 執行SQL語句,Scan() 將查詢結果映射到results切片中// 左連接: 左連接會保留左表的所有數據,即使右表中沒有匹配的數據,也會保留左表的數據。
// 右連接: 右連接會保留右表所有的數據,即使左表中沒有匹配的數據,也會保留右表數據。
// 內連接: 內連接只返回兩個表中匹配的數據,如果一個表中沒有匹配的數據,則不會返回結果。func GetProductListWithCategory() ([]ProductListResult, error) {var results []ProductListResultsql := `SELECTp.id,p.name,p.price,p.stock,p.status,p.cate_id,COALESCE(c.name, '未分類') as category_name,p.image_urlFROM products pLEFT JOIN products_cate c ON p.cate_id = c.idWHERE p.deleted_at IS NULLORDER BY p.created_at DESC`err := DB.Raw(sql).Scan(&results).Errorreturn results, err
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90274.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90274.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90274.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式六:工廠模式(Factory Pattern)

概念定義一個創建對象的接口&#xff0c;但讓子類決定實例化哪個類。實現示例#include <iostream> #include <memory>// 產品基類 class Product { public:virtual void use() 0;virtual ~Product() default; };// 具體產品A class ConcreteProductA : public Pr…

應用層自定義協議【序列化+反序列化】

文章目錄再談 “協議”重新理解read、write、recv、send和tcp為什么支持全雙工Server.cc網絡版計算機實現Socket封裝&#xff08;模板方法類&#xff09;socket.hpp定制協議JsonJson安裝定義一個期望的報文格式Protocol.hppParser.hppCalculator.hpp完整的處理過程Client.cc三層…

dify創建OCR工作流

實現ocr識別文件內容&#xff0c;引用dify的一個插件&#xff0c;插件名稱&#xff1a;mineru 引用在線版本mineru 具體操作說明&#xff0c;參見視頻&#xff1a; 第六篇&#xff1a;DifyOCR&#xff0c;掃描件最優解_嗶哩嗶哩_bilibili 引用本地部署mineru 上面的這種使用…

備受關注的“Facebook Email Scraper”如何操作?

Facebook Email Scraper&#xff08;臉書郵箱提取工具&#xff09;是一類用于從Facebook平臺提取公開郵箱信息的工具&#xff0c;其核心功能是通過解析用戶主頁、群組、頁面等公開內容&#xff0c;識別并提取其中包含的郵箱地址&#xff0c;為用戶提供結構化的聯系方式數據。這…

【網絡原理】萬字長文解密UDP/TCP——手把手教你理解網絡通信

目錄 1.前言 2.正文 2.1UDP協議 2.1.1UDP協議端格式 2.1.2UDP的特點 2.1.3理解UDP的“不可靠” 2.1.4面向數據報 2.1.5基于UDP的應用層協議 2.2TCP協議 2.2.1TCP協議端格式 2.2.2TCP十個核心機制 2.2.2.1確認應答 2.2.2.2超時重傳 確認應答超時重傳 vs 三次握手 …

MATLAB軟件使用頻繁,企業如何做到“少買多用”?

在制造企業的工程計算、算法研發、系統建模等場景中&#xff0c;MATLAB 已成為不可或缺的核心工具。 無論是動力學建模、控制算法開發&#xff0c;還是信號處理和數據可視化&#xff0c;MATLAB 的高頻使用場景覆蓋了從研發部門到測試部門的多個崗位。然而&#xff0c;企業 IT 負…

數據結構自學Day13 -- 快速排序--“分而治之”

&#x1f536; 一、快速排序&#xff08;Quick Sort&#xff09;&#x1f4cc; 基本思想&#xff1a;分而治之&#xff1a;每次從數組中選一個“基準”&#xff08;pivot&#xff09;&#xff0c;把比它小的放左邊&#xff0c;大的放右邊。對左右子數組遞歸排序。&#x1f9e0;…

Linux 進程與服務管理~進程基礎、進程查看、進程控制、服務管理、開機啟動??

在 Linux 系統中,進程與服務管理是運維和開發的核心技能之一。進程是程序運行的實例,服務是長期運行的后臺進程(守護進程)。掌握進程與服務的管理方法,能有效排查系統問題、優化資源使用。以下從 ??進程基礎、進程查看、進程控制、服務管理、開機啟動?? 五大模塊詳細講…

論文筆記 | Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes

論文地址&#xff1a;Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes 概述&#xff1a;本文提出 RGB-Stacking 基準測試&#xff0c;研究如何僅憑 RGB 攝像頭視覺和本體感知&#xff0c;實現機器人對 復雜幾何物體的高效堆疊。通過結合仿真專家訓練、交互…

React 英語打地鼠游戲——一個寓教于樂的英語學習游戲

&#x1f3af; 英語打地鼠游戲 一個寓教于樂的英語學習游戲&#xff0c;通過經典的打地鼠玩法幫助用戶學習英語單詞。 ? 項目特色 &#x1f3ae; 游戲化學習 經典打地鼠玩法&#xff1a;6 個洞穴&#xff0c;聽英文選單詞即時反饋&#xff1a;答對/答錯立即語音提示計分系…

Qt--Widget類對象的構造函數分析

Widget類對象的構造函數分析&#xff0c;用更直觀的方式解釋這段代碼的作用和工作原理&#xff1a;代碼&#xff1a;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }代碼解析 Widget::Widget(QWidget *parent) // 構造函數定…

使用pytorch創建模型時,nn.BatchNorm1d(128)的作用是什么?

在PyTorch中&#xff0c;nn.BatchNorm1d(128) 的作用是對 一維輸入數據&#xff08;如全連接層的輸出或時間序列數據&#xff09;進行批標準化&#xff08;Batch Normalization&#xff09;&#xff0c;具體功能與實現原理如下&#xff1a; 1. 核心作用 標準話數據分布 對每個批…

【數據結構】二叉樹的鏈式結構--用C語言實現

1.二叉樹的鏈式結構 此前&#xff0c;我們通過數組&#xff08;順序表&#xff09;完成了二叉樹的順序存儲&#xff0c;并實現了二叉樹的基礎功能 那么&#xff0c;二叉樹還有沒有其他存儲方式呢&#xff1f; 前面我們學習了鏈表&#xff0c;它是一種線性結構&#xff0c;而二…

java設計模式 -【適配器模式】

適配器模式的定義 適配器模式&#xff08;Adapter Pattern&#xff09;是一種結構型設計模式&#xff0c;用于解決接口不兼容問題。通過將一個類的接口轉換成客戶端期望的另一個接口&#xff0c;使原本因接口不匹配而無法工作的類能夠協同工作。 核心角色 目標接口&#xff08;…

前端,demo操作,增刪改查,to do list小項目

demo操作&#xff0c;html<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>&l…

Spring AI 項目實戰(十九):Spring Boot + AI + Vue3 + OSS + DashScope 構建多模態視覺理解平臺(附完整源碼)

系列文章 序號 文章名稱 1 Spring AI 項目實戰(一):Spring AI 核心模塊入門 2 Spring AI 項目實戰(二):Spring Boot + AI + DeepSeek 深度實戰(附完整源碼) 3 Spring AI 項目實戰(三):Spring Boot + AI + DeepSeek 打造智能客服系統(附完整源碼) 4

在 Ubuntu 20.04.5 LTS 系統上安裝 Docker CE 26.1.4 完整指南

在 Ubuntu 20.04.5 LTS 系統上安裝 Docker CE 26.1.4 完整指南版本選擇說明 為什么選擇 Docker CE 26.1.4&#xff1f; 1. 版本穩定性和成熟度 Docker CE 26.1.4 是 2024 年 5 月發布的穩定版本&#xff0c;經過了充分的測試和驗證相比最新的 28.x 版本&#xff0c;26.1.4 在生…

避坑指南:Windows 11中 Docker 數據卷的存放位置

在 PowerShell 中使用 docker volume inspect 命令&#xff0c;輸出如下&#xff1a; [{"CreatedAt": "2025-07-23T01:00:45Z","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/…

Hadoop大數據集群架構全解析

技術概述Hadoop的定義及其在大數據領域的地位Hadoop是由Apache基金會開發的開源分布式計算框架&#xff0c;基于Google的MapReduce和GFS論文思想實現&#xff0c;已成為大數據處理的事實標準。它通過分布式存儲和計算解決了傳統數據庫無法處理的海量數據存儲和分析問題&#xf…

【自動化測試】Selenium Python UI自動化測試實用教程

一、引言:Selenium與UI自動化測試基礎 1.1 Selenium簡介 Selenium是一個開源的Web應用自動化測試框架,支持多瀏覽器(Chrome、Firefox、Edge等)和多編程語言(Python、Java、JavaScript等),核心組件包括: WebDriver:通過瀏覽器原生API控制瀏覽器,模擬用戶操作(點擊、…