成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

學習gorm系列:創(chuàng)建數(shù)據(jù)庫連接

數(shù)據(jù)庫 其他數(shù)據(jù)庫
通過gorm建立數(shù)據(jù)庫連接的時候,要依賴于具體連接哪種數(shù)據(jù)庫,所以gorm項目下提供了多種數(shù)據(jù)庫的驅動。這些數(shù)據(jù)庫驅動遵守gorm提供的接口類型Dailector來創(chuàng)建連接。

大家好,我是漁夫子。

所以本系列文章意在深入的學習gorm,以便更好的理解和使用gorm,而不是簡單的使用增、刪、改、查功能。

什么是gorm

gorm是用于golang編程的非常優(yōu)秀的ORM庫,可使開發(fā)者對數(shù)據(jù)庫使用更為方便。該庫不僅支持多種數(shù)據(jù)庫。而且還提供了查詢構建器、關系映射、事務等多種功能。

初始化數(shù)據(jù)庫連接:gorm.Open

要針對數(shù)據(jù)庫進行操作,第一步就是要創(chuàng)建一個和數(shù)據(jù)庫的連接。在gorm中使用的就是gorm.Open函數(shù)。接下來就們就看一下gorm.Open都做了些什么事兒。

假設我們要連接一個mysql數(shù)據(jù)庫,像如下代碼這樣就能建立數(shù)據(jù)的連接:

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func main() {
  // refer https://github.com/go-sql-driver/mysql#dsn-data-source-name for details
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

我們看到上面的代碼還依賴了mysql的驅動庫:gorm.io/driver/mysql,該庫是mysql的驅動庫。這個就是要告訴gorm要連接的具體數(shù)據(jù)庫了。在go-gorm項目下還能找到sqlite、sqlserver、postgres以及clickhouse等常用的數(shù)據(jù)庫的驅動庫。地址是:https://github.com/go-gorm目錄下。

我們再看下gorm.Open的函數(shù)原型:

func Open(dialector Dialector, opts ...Option) (db *DB, err error)

第一個參數(shù)是Dialector接口。該接口定義如下:

type Dialector interface {
 Name() string
 Initialize(*DB) error
 Migrator(db *DB) Migrator
 DataTypeOf(*schema.Field) string
 DefaultValueOf(*schema.Field) clause.Expression
 BindVarTo(writer clause.Writer, stmt *Statement, v interface{})
 QuoteTo(clause.Writer, string)
 Explain(sql string, vars ...interface{}) string
}

看到這里就明白了,只要具體的數(shù)據(jù)庫驅動實現(xiàn)了該接口,gorm就能支持該數(shù)據(jù)庫的連接。也就是說上面我們提到的go-gorm目錄下的各種具體的數(shù)據(jù)庫驅動都實現(xiàn)了Dialector接口。

圖片圖片

image.png

dsn是什么

dsn,即data source name,指的是數(shù)據(jù)源名稱。在golang中,其格式如下:

[user[:password]@][net[(addr)]]/dbname[?param1=value1?mN=valueN]

mysql.Open函數(shù)

mysql.Open函數(shù)的返回值是gorm.Dialector對象。也就是說這里只是把相關的配置賦值給了gorm.Dialector接口類型,并沒有實際的和數(shù)據(jù)庫建立連接。如下是mysql.Open函數(shù)的實現(xiàn):

func Open(dsn string) gorm.Dialector {
 dsnConf, _ := mysql.ParseDSN(dsn)
 return &Dialector{Config: &Config{DSN: dsn, DSNConfig: dsnConf}}
}

當然,其他數(shù)據(jù)庫的Open函數(shù)也是類似,比如clickhouse數(shù)據(jù)庫的Open函數(shù)實現(xiàn)如下:

func Open(dsn string) gorm.Dialector {
 return &Dialector{Config: &Config{DSN: dsn}}
}

建立數(shù)據(jù)庫連接:Dialector.Initialize

在gorm.Open函數(shù)中,是通過Dialector.Initialize函數(shù)和數(shù)據(jù)庫建立實際連接的。如下:

if config.Dialector != nil {
   err = config.Dialector.Initialize(db)
}

Dialector就是上文中提到的通過各個具體的數(shù)據(jù)庫驅動的Open函數(shù)返回的接口類型。實際上也就是自己驅動下Dialector對象。然后在執(zhí)行各自實例的Initialize函數(shù),就能通過dsn中配置的地址和賬號建立數(shù)據(jù)庫連接了。

圖片圖片

我們還是以mysql數(shù)據(jù)庫為例,我們看下Initialize函數(shù)的核心實現(xiàn):

圖片圖片

本質上,在創(chuàng)建數(shù)據(jù)庫連接的時候還是基于golang標準庫的database/sql庫實現(xiàn)的。最終,通過gorm.Open函數(shù)就初始化了一個數(shù)據(jù)庫的連接

核心數(shù)據(jù)結構

上文提到,通過gorm.Open函數(shù)會得到一個gorm.DB對象。該對象是gorm中的核心數(shù)據(jù)結構。如下是gorm.DB的結構體:

圖片圖片

在gorm.DB結構中主要包含兩個類型的字段:Config和Statement。Config結構體根據(jù)名字可知主要是一些和數(shù)據(jù)庫相關的配置,比如和賬號密碼以及連接地址相關的Dailector、數(shù)據(jù)庫的連接ConnPool,日志相關的等。

Statement結構體,我們看到該結構體的主要由Table、Model、Select、Schema等組成,可想而知是跟具體的sql語句有關系的。

總結

通過gorm建立數(shù)據(jù)庫連接的時候,要依賴于具體連接哪種數(shù)據(jù)庫,所以gorm項目下提供了多種數(shù)據(jù)庫的驅動。這些數(shù)據(jù)庫驅動遵守gorm提供的接口類型Dailector來創(chuàng)建連接。實際創(chuàng)建連接的函數(shù)是Initialize函數(shù),并將創(chuàng)建好的連接返回給gorm.DB.ConnPool字段中。

責任編輯:武曉燕 來源: Go學堂
相關推薦

2023-10-08 08:11:54

2023-11-07 00:00:00

Dialector參數(shù)接口

2023-11-02 10:32:27

GoGORM

2011-06-27 12:56:28

2009-12-22 13:34:48

ADO.Net Tea

2009-12-24 15:11:47

ADO.NET數(shù)據(jù)庫連

2009-12-28 10:09:10

ADO.NET連接

2023-11-02 08:56:59

ORMGORM

2021-09-06 10:24:12

鴻蒙HarmonyOS應用

2023-08-29 07:35:15

2010-03-18 14:39:55

Python數(shù)據(jù)庫連接

2011-04-18 13:46:24

數(shù)據(jù)庫設計

2021-09-03 15:41:00

鴻蒙HarmonyOS應用

2023-12-20 12:49:05

索引數(shù)據(jù)檢索數(shù)據(jù)庫

2011-05-26 15:03:47

catalog數(shù)據(jù)庫

2009-09-25 13:18:15

Hibernate數(shù)據(jù)

2020-09-22 15:56:31

Java

2011-05-26 13:42:50

MFC連接MySql數(shù)據(jù)庫

2024-01-18 08:31:22

go實現(xiàn)gorm框架

2009-12-31 10:38:10

ADO.NET連接數(shù)據(jù)
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天看天天操 | 玖玖视频国产 | 欧美 日韩 亚洲91麻豆精品 | 天天躁日日躁aaaa视频 | 国产永久免费 | 日韩精品 | 狠狠干在线 | 精品一区二区视频 | 国产1区2区3区 | 美国十次成人欧美色导视频 | 综合成人在线 | 狠狠做深爱婷婷综合一区 | 欧美视频免费在线 | 亚洲 中文 欧美 日韩 在线观看 | 69堂永久69tangcom | 97视频在线看| 中文在线a在线 | 日本特黄a级高清免费大片 国产精品久久性 | 欧美大片在线观看 | 日本精品视频 | 一区二区三区小视频 | 日韩中文字幕 | 日本福利一区 | 国产丝袜一区二区三区免费视频 | 在线小视频 | 久久久91精品国产一区二区精品 | 日韩av成人在线观看 | 91国产在线视频在线 | 亚洲精品乱码久久久久久久久 | 久久三区 | 国产在线一区二区三区 | 欧美aaaaa| 日本黄色一级视频 | 日韩av免费在线观看 | 视频二区在线观看 | 在线看av网址 | 午夜男人的天堂 | 色站综合 | 正在播放国产精品 | 亚洲精品视频在线播放 | 91 久久|