偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

我們要不要使用 ORM?

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
使用 gorm 創(chuàng)建數(shù)據(jù)表的時(shí)候,會(huì)先要定義一個(gè)基本的數(shù)據(jù)模型,表示數(shù)據(jù)表中有哪些字段,其中 gorm 默認(rèn)給我們提供了一些默認(rèn) model,根據(jù)實(shí)際情況使用即可。

ORM 他是個(gè)啥?

一提到 ORM 很多同學(xué)知道他是跟數(shù)據(jù)庫(kù)相關(guān)的一個(gè)內(nèi)容,但是并不清楚他到底是這個(gè)啥,自己需不需要,到底怎么玩?

實(shí)際上 ORM 就那么一回事,從這三個(gè)字母就可以看到

O:Object

R:Relational

M:Mapping

對(duì)象關(guān)系映射,即關(guān)系型數(shù)據(jù)庫(kù)和我們的實(shí)體業(yè)務(wù)對(duì)象來(lái)進(jìn)行一個(gè)映射,對(duì)與我們使用 ORM 對(duì)象來(lái)說(shuō),就直接去使用其對(duì)應(yīng)的各種方法即達(dá)到自動(dòng)持久化的目的,無(wú)需關(guān)注具體的 sql 細(xì)節(jié)

因?yàn)?ORM 已經(jīng)為你隱藏了關(guān)于 sql 的部分,讓不熟悉 sql 的 xdm 也可以很好的上手

只要你知道如何使用函數(shù),使用對(duì)象里面的方法到底你的數(shù)據(jù)操作目的即可

為什么要用 ORM?

為什么要使用 ORM 呢?難道出了一個(gè)新的東西,我們就一定要用嗎?自然是要知道他的好,我們才會(huì)去使用

結(jié)論先放在前面,使用 ORM

  • 可以減少我們重復(fù)的寫(xiě)垃圾代碼,可以提高我們的工作效率,降低開(kāi)發(fā)成本
  • 訪(fǎng)問(wèn)數(shù)據(jù)的時(shí)候,可以使用抽象的方式,用起來(lái)非常簡(jiǎn)潔
  • 以及 orm 帶來(lái)的各種奇淫巧技

舉一個(gè) gorm 的例子

在 GO 中我們?cè)L問(wèn) mysql 關(guān)系型數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)中提前先創(chuàng)建好了數(shù)據(jù)庫(kù),數(shù)據(jù)表,以及 3 條記錄

圖片圖片

GO 中有給我們提供對(duì)應(yīng)的庫(kù)

import "database/sql"
import _ "github.com/go-sql-driver/mysql"

我們可以使用 sql.Open() 連接 mysql 數(shù)據(jù)庫(kù)

func Connect() (*sql.DB, error) {
   db, err := sql.Open("mysql", "root:123456@/test_gorm")
   if err != nil {
      return nil, err
   }
   return db, nil
}

獲取到 db 句柄之后,我們可以通過(guò)這樣的方式,輸入 sql 語(yǔ)句來(lái)查詢(xún)數(shù)據(jù)

圖片圖片

可以發(fā)現(xiàn),本次的查詢(xún)語(yǔ)句是 select id,name,email,member_number,address from users where id = ? ,我們?cè)僖粭l數(shù)據(jù)一條數(shù)據(jù)的讀取出來(lái)(此處需要注意使用讀取 rows.Next() 的時(shí)候,需要讀取完畢之后,關(guān)閉句柄,否則會(huì)資源泄漏)

圖片圖片

那么如果我們換成別的查詢(xún)語(yǔ)句,或者其他增刪改的語(yǔ)句呢?

回顧一下以前各種瘋狂寫(xiě)重復(fù)代碼 sql 代碼的情況,流程是一樣的,代碼結(jié)構(gòu)也是類(lèi)似的,寫(xiě)著差不多的代碼,過(guò)著差不多的人生嗎?

甚至這一塊的代碼很多或許都是復(fù)制粘貼,然后改改 sql,改改響應(yīng)結(jié)果

這也太無(wú)聊和重復(fù)了,咱們還真的是個(gè)碼農(nóng)了?別人搬磚,我們搬代碼?

這不,這個(gè)時(shí)候,我們就可以使用 ORM 來(lái)幫助我們提高生產(chǎn)效率, 減少我們的低價(jià)值重復(fù)勞動(dòng),可以留更多的時(shí)間來(lái)進(jìn)行思考和優(yōu)化

這樣,我們使用 gorm 的話(huà),連接數(shù)據(jù)我們就可以這樣來(lái)寫(xiě)

func Connect(user, pwd, ip, port string) (*gorm.DB, error) {
   db, err := gorm.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%s)/test_gorm?charset=utf8&parseTime=True&loc=Local", user, pwd, ip, port))
   if err != nil {
      return nil, err
   }
   return db, nil
}

上述的查詢(xún)就會(huì)變成這樣的

圖片圖片

有沒(méi)有發(fā)現(xiàn),對(duì)應(yīng)的地方,使用 orm 的方式,對(duì)于咱們來(lái)說(shuō),其實(shí)就是需要查詢(xún)一條數(shù)據(jù),完全都不需要去關(guān)心 sql ,只需要按照對(duì)象去應(yīng)用方法就可以查詢(xún)我們想要的數(shù)據(jù)

圖片圖片

看到這里,有沒(méi)有初步覺(jué)得 ORM 還是很香的,至少咱們寫(xiě)數(shù)據(jù)持久化的時(shí)候,就不需要寫(xiě)那么多重復(fù)代碼了,使用 ORM 方便高效

gorm 簡(jiǎn)述和提醒

看了上述例子是否會(huì)有這些疑問(wèn),

  1. Import 包的時(shí)候?yàn)槭裁磳?dǎo)入了又不用?
  2. 為什么連接數(shù)據(jù)庫(kù)的時(shí)候需要帶上 mysql 字符串?
import _ "github.com/go-sql-driver/mysql"

首先,一個(gè)庫(kù)如果不用的話(huà),那當(dāng)然是沒(méi)有必要導(dǎo)入的,導(dǎo)入了正式因?yàn)樾枰褂?/p>

可以看到 mysql 包中的 init 函數(shù),實(shí)際上就是做一個(gè)注冊(cè),用一個(gè)有效的名字,對(duì)一個(gè)這一個(gè)數(shù)據(jù)庫(kù)引擎

func init() {
   sql.Register("mysql", &MySQLDriver{})
}

Register 實(shí)現(xiàn)如下

圖片圖片

可以看到在sql包里面有一個(gè)全局map,里把存放了mysql這個(gè)名字的driver

圖片圖片

再來(lái)查看 gorm.Open() 的實(shí)現(xiàn)就一目了然了

gorm.Open 中調(diào)用了 sql.Open , sql.Open 中去從全局的 map driver中獲取 mysql 字符串對(duì)應(yīng)的引擎

gorm.Open

圖片圖片

sql.Open

圖片圖片

這一塊就到這里,如果需要系統(tǒng)的學(xué)習(xí)和了解 gorm,可以從這里進(jìn)入:

  • https://www.topgoer.cn/docs/gorm/gorm-1c54sbcda16o6
  • https://gorm.io/
  1. gorm.Open 為什么要帶上 charset=utf8&parseTime=True&loc=Local

其中 charset 是表示字符編碼

parseTime 為 True ,表示處理數(shù)據(jù)的時(shí)候,會(huì)去解析時(shí)間

loc=Local 表示入庫(kù)的時(shí)候,使用的是本地時(shí)區(qū)

以及 gorm 有沒(méi)有其他的坑?

實(shí)際上在應(yīng)用 gorm 的時(shí)候,還是會(huì)有很多坑等著咱們,此處先給大家避避坑

與其說(shuō)是坑,實(shí)際上還是自己去應(yīng)用一個(gè)技術(shù)的時(shí)候?qū)ζ洳粔蛄私猓J(rèn)知沒(méi)有對(duì)齊導(dǎo)致的

  • 創(chuàng)建數(shù)據(jù)表的坑

使用 gorm 創(chuàng)建數(shù)據(jù)表的時(shí)候,會(huì)先要定義一個(gè)基本的數(shù)據(jù)模型,表示數(shù)據(jù)表中有哪些字段,其中 gorm 默認(rèn)給我們提供了一些默認(rèn) model,根據(jù)實(shí)際情況使用即可

type Model struct {
   ID        uint `gorm:"primary_key"`
   CreatedAt time.Time
   UpdatedAt time.Time
   DeletedAt *time.Time `sql:"index"`
}

例如我們子定義的表結(jié)構(gòu)是這樣的:

圖片圖片

創(chuàng)建出來(lái)的表格名為 users ,我們可以使用如下語(yǔ)句禁用表名復(fù)數(shù),或者自定義一個(gè)表名都是可以的

db.SingularTable(true)
  • 解析時(shí)間的坑

上述使用 gorm.Open() 連接數(shù)據(jù)庫(kù)的時(shí)候,咱們指定了 parseTime=True ,那么后續(xù)處理時(shí)間類(lèi)型的數(shù)據(jù)就不會(huì)有問(wèn)題,如果不指定的話(huà),gorm 處理時(shí)間類(lèi)型的數(shù)據(jù)會(huì)處理出錯(cuò)

  • 想當(dāng)然的坑

ORM 固然用起來(lái)方便,不動(dòng) sql 的人用起來(lái)也很爽,但是一些基本的操作還是要注意的,否則會(huì)對(duì)性能影響非常大

例如,查詢(xún)一批數(shù)據(jù)的時(shí)候獲取會(huì)想當(dāng)然的這樣來(lái)寫(xiě)

// 偽代碼,示意一波
userList:=[]int{1, 3, 5}
user := dao.User{}
for _,v := range userList {
    db.First(&user, v)
}

或許在寫(xiě)其他邏輯的時(shí)候這樣寫(xiě)好像沒(méi)啥問(wèn)題,但是你要明白現(xiàn)在是操作數(shù)據(jù)庫(kù),怎么可以循環(huán)操作數(shù)據(jù)庫(kù)呢?如果 demo 中的 userList 足夠的大,那么結(jié)果可想而知

在 gorm 完全可以使用 where 的方式來(lái)達(dá)到我們的查詢(xún)目的,還是需要我們理解了之后,靈活使用,不要生搬硬套,例如

users := make([]dao.User, 0)
db.Where("id in (?)", []int{1, 2, 3}).Find(&users)

ORM 給我們帶來(lái)了哪些問(wèn)題?

Xdm 閉著眼睛想一下,原來(lái)是直接就使用 sql 去操作數(shù)據(jù)庫(kù)的,現(xiàn)在咱們通過(guò)了一層 gorm 對(duì)象,自然是會(huì)對(duì)我們的性能帶來(lái)影響的,而且 ORM 是多層系統(tǒng)的

  • ORM 里面需要去管理多個(gè)關(guān)聯(lián)和映射,需要消耗資源
  • 需要咱們學(xué)習(xí)新知識(shí),增加學(xué)習(xí)成本
  • 會(huì)產(chǎn)生依賴(lài),長(zhǎng)期不用 sql,慢慢的可能你就不會(huì)完整的 sql 了
  • 稍不注意可能就會(huì)寫(xiě)出低性能的代碼
  • ... 等等,歡迎補(bǔ)充

如何去考慮是否要使用 ORM?

那么我們知道了 ORM 的優(yōu)劣,那么我們是否要去選擇并使用它呢?

根據(jù)我們實(shí)際項(xiàng)目的需要來(lái)定,如果項(xiàng)目比較大,對(duì)性能要求較高,那么還是不要使用了

如果項(xiàng)目不大,并且有很多簡(jiǎn)單的,重復(fù)的,低效的數(shù)據(jù)操作,那么還是可以使用的,使用起來(lái)確實(shí)非常方便,方便到讓你忘記 sql

總的來(lái)說(shuō),要還是不要,是個(gè)問(wèn)題,如果是你,你會(huì)怎么選?

責(zé)任編輯:武曉燕 來(lái)源: 阿兵云原生
相關(guān)推薦

2012-03-16 14:23:00

框架

2012-03-16 14:23:00

框架

2019-09-27 15:40:04

云計(jì)算數(shù)據(jù)庫(kù)DBaaS

2019-10-09 08:53:47

數(shù)據(jù)庫(kù)即服務(wù)DBaaS云計(jì)算

2020-04-30 09:24:46

Go項(xiàng)目語(yǔ)言

2013-11-29 14:04:42

2017-11-20 09:00:43

跳槽職場(chǎng)精英年終獎(jiǎng)

2021-02-21 09:09:24

GoGOPATH代碼

2020-11-17 09:17:58

框架組件基礎(chǔ)服務(wù)

2014-12-09 09:13:46

BaaS云備份備份即服務(wù)

2018-07-12 09:04:15

RAID陣列硬盤(pán)

2018-01-24 07:58:47

框架組件技術(shù)棧開(kāi)源

2021-10-21 09:41:43

互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)

2018-12-06 14:40:07

蘋(píng)果iOS 12.1.1 iOS 12

2018-11-19 09:02:53

垃圾代碼辭職入職

2020-04-20 09:32:31

VIM程序員編程

2015-07-15 10:25:44

SDN物理交換機(jī)

2020-05-26 07:40:33

微服務(wù)聚合工程Project

2024-09-30 05:38:48

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)