精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入理解gorm是如何和數(shù)據(jù)庫(kù)建立連接的

開(kāi)發(fā) 前端
在gorm.Open函數(shù)中,第一個(gè)參數(shù)是Dialector類(lèi)型的參數(shù),這是一個(gè)接口類(lèi)型。也就是說(shuō)只要實(shí)現(xiàn)了該接口,就能作為一個(gè)Dialector。這也就是gorm能夠針對(duì)很多數(shù)據(jù)庫(kù)進(jìn)行操作的原因。

大家好,我是漁夫子。

本期和大家一起學(xué)習(xí)下gorm是如何和數(shù)據(jù)庫(kù)建立連接的。

一、gorm.Open

通常情況下,我們是通過(guò)gorm.Open函數(shù)就能在應(yīng)用層和數(shù)據(jù)建立連接。如下:

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

func main() {
  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{})
}

在該代碼片段中,我們傳入了數(shù)據(jù)庫(kù)的用戶(hù)名、密碼、地址以及數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)對(duì)應(yīng)的配置。然后通過(guò)gorm.Open函數(shù)就和數(shù)據(jù)庫(kù)建立連接了,gorm.Open函數(shù)返回的是一個(gè)gorm.DB對(duì)象。如下:

// DB GORM DB definition
type DB struct {
 *Config
 Error        error
 RowsAffected int64
 Statement    *Statement
 clone        int
}

在該數(shù)據(jù)結(jié)構(gòu)中并沒(méi)有和數(shù)據(jù)庫(kù)連接相關(guān)的字段,那gorm.Open到底是如何和mysql數(shù)據(jù)庫(kù)建立連接的呢?我們繼續(xù)深入gorm.Open函數(shù)和mysql.Open函數(shù)的詳細(xì)內(nèi)容。

二、gorm.Open函數(shù)

在gorm.Open函數(shù)中,傳入的參數(shù)是一個(gè)Dialector?接口類(lèi)型的dialector變量。我們看到會(huì)將傳入的Dialector變量賦值給配置config.Dialector,如下:

config.Dialector = dialector

然后,又通過(guò)config.Dialector的Initialize函數(shù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行了初始化。如下:

err = config.Dialector.Initialize(db)

那么,Dialector是什么呢?Dialector是通過(guò)gorm.Open函數(shù)的第一個(gè)參數(shù)傳進(jìn)來(lái)的。我們看具體的是什么。

三、Dialector參數(shù)

在gorm.Open函數(shù)中,第一個(gè)參數(shù)是Dialector類(lèi)型的參數(shù),這是一個(gè)接口類(lèi)型。也就是說(shuō)只要實(shí)現(xiàn)了該接口,就能作為一個(gè)Dialector。這也就是gorm能夠針對(duì)很多數(shù)據(jù)庫(kù)進(jìn)行操作的原因。比如MySQL、ClickHouse等。Dialector接口類(lèi)型定義如下:

// Dialector GORM database 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
}

具體到mysql的數(shù)據(jù)庫(kù),我們看到是通過(guò)gorm.io/driver/mysql?庫(kù)的Open函數(shù)來(lái)初始化的。我們看下mysql.Open函數(shù)的實(shí)現(xiàn),如下:

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

該函數(shù)接收一個(gè)dsn的字符串,也就是第一節(jié)中我們提供的和數(shù)據(jù)庫(kù)相關(guān)的賬號(hào)密碼等連接數(shù)據(jù)的信息。然后,返回的是mysql驅(qū)動(dòng)包中的Dialector對(duì)象。該對(duì)象包含了相關(guān)的配置。

然后,是在gorm.Open函數(shù)中,調(diào)用了Dialector的Initialize?函數(shù)。我們看下該函數(shù)中和數(shù)據(jù)庫(kù)連接相關(guān)的邏輯。

func (dialector Dialector) Initialize(db *gorm.DB) (err error) {
 if dialector.DriverName == "" {
  dialector.DriverName = "mysql"
 }

 if dialector.DefaultDatetimePrecision == nil {
  dialector.DefaultDatetimePrecision = &defaultDatetimePrecision
 }

 if dialector.Conn != nil {
  db.ConnPool = dialector.Conn
 } else {
  db.ConnPool, err = sql.Open(dialector.DriverName, dialector.DSN)
  if err != nil {
   return err
  }
 }
    // 省略其他代碼
}

大家看到,在第13行的地方,是通過(guò)sql.Open函數(shù)來(lái)進(jìn)行具體的和數(shù)據(jù)庫(kù)進(jìn)行連接的。然后返回的對(duì)象是sql.DB類(lèi)型,大家注意,這里的sql.DB類(lèi)型是go標(biāo)準(zhǔn)庫(kù)中的DB,而非gorm庫(kù)中的DB。返回的sql.DB對(duì)象賦值給了gorm中DB對(duì)象中的ConnPool。

同時(shí),在gorm.Open函數(shù)中,還將db.ConnPool對(duì)象賦值給了db.Statement.ConnPool對(duì)象。到這里是不是gorm.DB結(jié)構(gòu)體中的字段就和數(shù)據(jù)庫(kù)的具體連接關(guān)聯(lián)起來(lái)。

接下來(lái),我們?cè)倏纯磗ql.Open函數(shù)是如何和數(shù)據(jù)庫(kù)建立連接的。

四、sql.Open函數(shù)

先看sql.Open函數(shù)的源代碼:

func Open(driverName, dataSourceName string) (*DB, error) {
 driversMu.RLock()
 driveri, ok := drivers[driverName]
 driversMu.RUnlock()
 if !ok {
  return nil, fmt.Errorf("sql: unknown driver %q (forgotten import?)", driverName)
 }

 if driverCtx, ok := driveri.(driver.DriverContext); ok {
  connector, err := driverCtx.OpenConnector(dataSourceName)
  if err != nil {
   return nil, err
  }
  return OpenDB(connector), nil
 }

 return OpenDB(dsnConnector{dsn: dataSourceName, driver: driveri}), nil
}

我們先簡(jiǎn)單分析下上述代碼。在第3行處,從drivers中獲取對(duì)應(yīng)的驅(qū)動(dòng)名稱(chēng)的具體驅(qū)動(dòng)對(duì)象。這里的driverName是mysql。然后從第9行到第14行是執(zhí)行具體驅(qū)動(dòng)程序的連接函數(shù)。

首先,我們先看從drivers中根據(jù)驅(qū)動(dòng)名稱(chēng)mysql獲取驅(qū)動(dòng)對(duì)象的邏輯。drivers是標(biāo)準(zhǔn)庫(kù)sql中的一個(gè)map類(lèi)型,如下:

drivers   = make(map[string]driver.Driver)

該變量是通過(guò)sql包中的Register函數(shù)進(jìn)行注冊(cè)的:

func Register(name string, driver driver.Driver) {
 driversMu.Lock()
 defer driversMu.Unlock()
 if driver == nil {
  panic("sql: Register driver is nil")
 }
 if _, dup := drivers[name]; dup {
  panic("sql: Register called twice for driver " + name)
 }
 drivers[name] = driver
}

該函數(shù)又是在哪里進(jìn)行調(diào)用的呢?我們?cè)倩卣{(diào)gorm.Open函數(shù)中,第一個(gè)參數(shù)調(diào)用的是mysql.Open函數(shù)。也就是說(shuō)引入了庫(kù)gorm.io/driver/mysql?,在該庫(kù)中,我們看到又引入了github.com/go-sql-driver/mysql?庫(kù)。該庫(kù)中有一個(gè)init方法,如下:

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

原來(lái),這里調(diào)用了標(biāo)準(zhǔn)庫(kù)sql中的Register函數(shù),將“mysql”和對(duì)應(yīng)的驅(qū)動(dòng)對(duì)象MySQLDriver進(jìn)行了注冊(cè)關(guān)聯(lián)。

我們?cè)俜祷貋?lái)看sql.Open函數(shù)的具體實(shí)現(xiàn)。那這里就繼續(xù)調(diào)用MySQLDriver的OpenConnector方法。我們看下該方法的實(shí)現(xiàn)如下:

// OpenConnector implements driver.DriverContext.
func (d MySQLDriver) OpenConnector(dsn string) (driver.Connector, error) {
 cfg, err := ParseDSN(dsn)
 if err != nil {
  return nil, err
 }
 return &connector{
  cfg: cfg,
 }, nil
}

該函數(shù)首先通過(guò)ParseDSN解析dsn字符串中的用戶(hù)名,地址,密碼等配置選項(xiàng)。然后返回一個(gè)connector對(duì)象。該connector對(duì)象就是在sql.Open函數(shù)中執(zhí)行的OpenDB(connector)函數(shù)中的參數(shù)。

我們繼續(xù)看sql.OpenDB函數(shù)的實(shí)現(xiàn),如下:

func OpenDB(c driver.Connector) *DB {
 ctx, cancel := context.WithCancel(context.Background())
 db := &DB{
  connector:    c,
  openerCh:     make(chan struct{}, connectionRequestQueueSize),
  lastPut:      make(map[*driverConn]string),
  connRequests: make(map[uint64]chan connRequest),
  stop:         cancel,
 }

 go db.connectionOpener(ctx)

 return db
}

這里首先構(gòu)建了一個(gè)sql.DB對(duì)象,同時(shí)執(zhí)行了一個(gè)協(xié)程進(jìn)行數(shù)據(jù)庫(kù)的連接:

go db.connectionOpener(ctx)

接著看db.connectionOpener函數(shù)的實(shí)現(xiàn),如下:

// Runs in a separate goroutine, opens new connections when requested.
func (db *DB) connectionOpener(ctx context.Context) {
 for {
  select {
  case <-ctx.Done():
   return
  case <-db.openerCh:
   db.openNewConnection(ctx)
  }
 }
}

這里,有一個(gè)db.openNewConnection函數(shù),根據(jù)名字可知是打開(kāi)新的連接。其實(shí)現(xiàn)如下:

// Open one new connection
func (db *DB) openNewConnection(ctx context.Context) {

 ci, err := db.connector.Connect(ctx)
    // ...省略代碼

 dc := &driverConn{
  db:         db,
  createdAt:  nowFunc(),
  returnedAt: nowFunc(),
  ci:         ci,
 }
 if db.putConnDBLocked(dc, err) {
  db.addDepLocked(dc, dc)
 } else {
  db.numOpen--
  ci.Close()
 }
}

這里我們看到有一個(gè)db.connector.Connect函數(shù),connector就是github.com/go-sql-driver/mysql?庫(kù)中的connector對(duì)象。我們回到該庫(kù),查看其Connect函數(shù)的實(shí)現(xiàn):

// Connect implements driver.Connector interface.
// Connect returns a connection to the database.
func (c *connector) Connect(ctx context.Context) (driver.Conn, error) {
 var err error

 // New mysqlConn
 mc := &mysqlConn{
  maxAllowedPacket: maxPacketSize,
  maxWriteSize:     maxPacketSize - 1,
  closech:          make(chan struct{}),
  cfg:              c.cfg,
 }
 mc.parseTime = mc.cfg.ParseTime

 // Connect to Server
 dialsLock.RLock()
 dial, ok := dials[mc.cfg.Net]
 dialsLock.RUnlock()
 if ok {
     //...省略代碼
 } else {
  nd := net.Dialer{Timeout: mc.cfg.Timeout}
  mc.netConn, err = nd.DialContext(ctx, mc.cfg.Net, mc.cfg.Addr)
 }

 // Enable TCP Keepalives on TCP connections
 if tc, ok := mc.netConn.(*net.TCPConn); ok {
  if err := tc.SetKeepAlive(true); err != nil {
            //...省略代碼
  }
 }

 mc.buf = newBuffer(mc.netConn)
 //...

 // Reading Handshake Initialization Packet
 authData, plugin, err := mc.readHandshakePacket()
 if err != nil {
  mc.cleanup()
  return nil, err
 }


 // Send Client Authentication Packet
 authResp, err := mc.auth(authData, plugin)

 if err = mc.writeHandshakeResponsePacket(authResp, plugin); err != nil {
  mc.cleanup()
  return nil, err
 }

 // Handle response to auth packet, switch methods if possible
 if err = mc.handleAuthResult(authData, plugin); err != nil {
  mc.cleanup()
  return nil, err
 }

 return mc, nil
}

這里我們主要看第22到23行,這里進(jìn)行了實(shí)際的撥號(hào)操作,也就是和數(shù)據(jù)庫(kù)真正的建立了連接。再看第27行,斷言是一個(gè)TCP連接。第37行,進(jìn)行了握手處理;第45行,進(jìn)行了認(rèn)證處理。最終返回了一個(gè)mysqlConn對(duì)象。該mysqlConn結(jié)構(gòu)體中包含字段如下:

type mysqlConn struct {
 buf              buffer
 netConn          net.Conn
 rawConn          net.Conn // underlying connection when netConn is TLS connection.
    // ...
}

其中,netConn就是和數(shù)據(jù)庫(kù)建立的TCP的連接。

五、從mysql到gorm.DB

我們?cè)倏偨Y(jié)下上述和mysql相關(guān)的各個(gè)對(duì)象之間的關(guān)聯(lián)關(guān)系。從mysql開(kāi)始逆向推導(dǎo)。如下:圖片

也就是說(shuō),我們?cè)谑褂胓orm進(jìn)行數(shù)據(jù)庫(kù)操作的時(shí)候,最終都是從gorm.Statement.ConnPool中獲取的數(shù)據(jù)庫(kù)連接來(lái)具體執(zhí)行sql語(yǔ)句的。

好了,今天gorm是如何和mysql建立連接的過(guò)程就跟大家分享到這里。

責(zé)任編輯:武曉燕 來(lái)源: Go學(xué)堂
相關(guān)推薦

2023-08-24 08:47:38

2023-10-08 08:11:54

2024-12-02 11:39:30

2016-12-08 15:36:59

HashMap數(shù)據(jù)結(jié)構(gòu)hash函數(shù)

2020-07-21 08:26:08

SpringSecurity過(guò)濾器

2010-06-01 15:25:27

JavaCLASSPATH

2012-11-22 10:11:16

LispLisp教程

2024-10-21 08:08:56

2019-09-16 08:32:59

遞歸算法編程

2009-09-25 09:14:35

Hibernate日志

2021-02-17 11:25:33

前端JavaScriptthis

2023-10-19 11:12:15

Netty代碼

2013-09-22 14:57:19

AtWood

2017-08-15 13:05:58

Serverless架構(gòu)開(kāi)發(fā)運(yùn)維

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2020-09-23 10:00:26

Redis數(shù)據(jù)庫(kù)命令

2017-01-10 08:48:21

2019-06-25 10:32:19

UDP編程通信

2024-02-21 21:14:20

編程語(yǔ)言開(kāi)發(fā)Golang

2025-06-05 05:51:33

點(diǎn)贊
收藏

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

日韩精品中文字幕吗一区二区| 亚洲av无码乱码在线观看性色| 亚洲人成精品久久久| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 蜜桃视频一区二区三区在线观看 | 国产美女精品写真福利视频| 91日韩在线专区| 国产日韩欧美成人| 日本特黄一级片| 日韩视频在线观看| 亚洲成avwww人| 三年中国国语在线播放免费| 天天色天天射天天综合网| 久久久久久久久久看片| 91久久久一线二线三线品牌| 黄色片视频网站| 一本精品一区二区三区| 亚洲色图国产精品| 91成人在线观看喷潮蘑菇| av成人在线观看| 午夜精品久久久久久久久久 | 欧美激情二区| 99视频热这里只有精品免费| 国产欧美久久久久久| 日韩精品一区三区| 91精品国产自产在线观看永久∴| 日韩电影第一页| 丰满人妻一区二区三区大胸| 成人福利片在线| 欧美日韩人人澡狠狠躁视频| 欧美日韩激情四射| 国内精品久久久久久野外| 久久久久久久久久看片| 韩国成人av| av中文字幕观看| 日韩va亚洲va欧美va久久| 国内揄拍国内精品少妇国语| 欧美爱爱小视频| 97视频热人人精品免费| 一区二区三区亚洲| 亚洲熟妇无码av| 欧美国产不卡| 亚洲精品国产精品自产a区红杏吧| 一级片免费在线观看视频| 成人交换视频| 欧美视频在线播放| 男人的天堂日韩| 久久电影tv| 日韩欧美在线网址 | 免费人成在线不卡| 国产精品高潮呻吟久久av野狼| 亚洲 欧美 视频| 亚洲精选在线| 91wwwcom在线观看| 伊人久久综合视频| 亚洲激情专区| 555www成人网| 天堂网免费视频| 日韩国产在线一| 2023亚洲男人天堂| 天堂在线免费观看视频| 久久午夜精品一区二区| 国产精品v片在线观看不卡| 69国产精品视频免费观看| 在线亚洲国产精品网站| 51ⅴ精品国产91久久久久久| 日本中文字幕久久| 日本在线不卡视频一二三区| 国产精品网红直播| 国产毛片在线视频| 懂色av中文字幕一区二区三区| 激情欧美一区二区三区中文字幕| 污污视频在线免费看| 久久久国产午夜精品| 四虎一区二区| gogo在线高清视频| 午夜影院在线观看欧美| 久久久久免费精品| 激情小说亚洲| 日韩欧美久久一区| 免费看黄色aaaaaa 片| 国产日产精品一区二区三区四区的观看方式 | 精品久久久久久乱码天堂| 内射无码专区久久亚洲| 久久久美女艺术照精彩视频福利播放| 日韩精品久久久| gogo在线观看| 色综合久久久久综合体桃花网| 一级在线免费视频| 视频精品二区| 亚洲人成在线观看网站高清| 日日噜噜夜夜狠狠久久波多野| 亚洲成人直播| 国产日韩欧美成人| 五月婷婷丁香六月| 国产精品成人免费精品自在线观看| 国产又黄又爽免费视频| 性欧美freesex顶级少妇| 欧美日韩国产免费一区二区| 性活交片大全免费看| 精品国精品国产自在久国产应用| 久久偷看各类女兵18女厕嘘嘘| 国产午夜久久久| 日韩二区三区四区| 国产高清精品一区二区三区| 69久久夜色| 欧美日韩综合视频网址| 91热视频在线观看| 自拍自偷一区二区三区| 欧美国产在线电影| 性色av一区二区三区四区| www.66久久| 欧美一级爱爱视频| 久久69成人| 精品日韩欧美在线| 日韩精品一区二区亚洲av性色| 国产精品亚洲综合久久| 高清av免费一区中文字幕| 在线日本中文字幕| 色一情一伦一子一伦一区| 亚洲熟女乱综合一区二区| 狠狠色丁香婷婷综合影院| 97激碰免费视频| 国产极品久久久| 国产精品私人影院| 日韩手机在线观看视频| 美女网站色精品尤物极品姐弟| 米奇精品一区二区三区在线观看| 糖心vlog精品一区二区| 久久久久久**毛片大全| 僵尸世界大战2 在线播放| 警花av一区二区三区| 中文字幕综合一区| 久久精品国产亚洲av麻豆蜜芽| 99精品视频一区| 少妇人妻无码专区视频| 日韩欧美中文字幕在线视频 | 99在线视频影院| 日韩免费一区二区| 中文字幕在线有码| 国产综合色在线视频区| 中文字幕一区二区三区乱码| 91av一区| 色偷偷91综合久久噜噜| 中文字幕 欧美激情| 国产欧美日韩三区| 91视频免费版污| 欧美亚洲国产激情| 国产精品久久久久久久久久久久 | 久久久人成影片免费观看| 国产精品视频最多的网站| 成年人免费在线视频| 色综合久久综合中文综合网| 亚洲精品一区二区三区影院忠贞| 日韩福利电影在线观看| 亚洲高清视频在线观看| 狠狠久久伊人中文字幕| 日韩在线www| 精品人妻一区二区三区蜜桃| 一区二区免费在线| 亚洲少妇中文字幕| 国产精品五区| 亚洲欧美日产图| 成人久久精品| 久久久久国产精品免费网站| 欧美熟妇交换久久久久久分类| 午夜视频一区在线观看| av在线网站观看| 美女网站色91| 五月天激情图片| 加勒比色老久久爱综合网| 91豆花精品一区| 超碰国产在线观看| 日韩一卡二卡三卡国产欧美| 日韩xxx高潮hd| 国产欧美日韩另类视频免费观看| 尤物国产在线观看| 欧美日韩国产一区精品一区| 国产一区二区三区奇米久涩| freexxx性亚洲精品| 国产亚洲欧美另类中文| 99精品人妻无码专区在线视频区| 亚洲一区二区美女| 九色porny自拍视频| 久久成人久久爱| 韩日视频在线观看| 精品99久久| 91九色蝌蚪嫩草| 日韩免费福利视频| 欧美成人精品在线| 女人天堂在线| 日韩欧美不卡一区| 国产字幕在线观看| 日韩理论片在线| 香蕉视频黄色在线观看| 国产在线一区二区| 人妻少妇被粗大爽9797pw| 国产精品成人a在线观看| 狠狠色噜噜狠狠狠狠色吗综合| 欧美123区| 国内精品久久久久久| gogogo高清在线观看免费完整版| 日韩精品中午字幕| 伊人亚洲综合网| 大桥未久av一区二区三区| 国产精品国产精品88| 国产亚洲综合在线| 日本国产在线视频| 久久99精品久久久久婷婷| 日韩av片在线看| 黄色日韩精品| a级网站在线观看| 国产欧美日韩免费观看| 国产区一区二区| 国产精品一区二区三区www| 日本欧美精品在线| av免费在线视| 色综合天天综合网国产成人网| 91ph在线| 国产一区二区三区18| 天堂av电影在线观看| 日韩午夜精品电影| 亚洲中文字幕在线观看| 91黄色免费看| 一级黄色av片| 欧美性开放视频| 欧美一二三区视频| 亚洲午夜久久久久久久久久久| 希岛爱理中文字幕| 中文字幕一区二区三区不卡| 中字幕一区二区三区乱码| 久久亚洲二区三区| yy1111111| 成人av网站免费| 亚洲熟女一区二区三区| 国产精品亚洲а∨天堂免在线| 久久久久xxxx| 极品销魂美女一区二区三区| 在线观看国产一级片| 奇米综合一区二区三区精品视频| 国产成人久久777777| 久久黄色影院| av无码精品一区二区三区| 亚洲综合二区| 99爱视频在线| 欧美一级二区| 欧美性大战久久久久xxx| 亚洲免费一区二区| 黄色片一级视频| 日韩成人免费看| 污片在线免费看| 久久99国产精品久久| 三级黄色片播放| 国产不卡视频在线播放| 催眠调教后宫乱淫校园| 波多野结衣在线一区| 国产精品边吃奶边做爽| 久久综合一区二区| 高清国产在线观看| 《视频一区视频二区| 欧美精品成人久久| 亚洲h在线观看| 亚洲成人av影片| 欧美亚洲愉拍一区二区| 91精品国产综合久| 日韩欧美在线观看一区二区三区| 亚洲精品成人电影| 亚洲精品自拍第一页| 蜜芽tv福利在线视频| 中文字幕欧美日韩在线| a免费在线观看| 91精品国产精品| 成人看片毛片免费播放器| 成人做爰www免费看视频网站| 亚洲国产欧美在线观看| 精品乱码一区| av中文字幕一区二区| 女女同性女同一区二区三区按摩| 欧美视频成人| 欧美黑人又粗又大又爽免费| 精品在线你懂的| 污片免费在线观看| 亚洲国产高清不卡| 一区二区在线观看免费视频| 欧美日韩午夜激情| 中文字幕有码视频| 欧美mv日韩mv| 国产日韩精品在线看| 欧美老女人性生活| 成人国产二区| 51午夜精品| 精品国产精品| 国产在线视频在线| 青青青爽久久午夜综合久久午夜| 一级片免费在线观看视频| 久久久久久久久久久99999| 综合五月激情网| 一本大道av伊人久久综合| 国产精品无码久久av| 亚洲精品网站在线播放gif| 黄色成人在线| 国产精品激情av电影在线观看| 97久久超碰| 亚洲精品一区二区三区四区五区| 一区二区亚洲精品| 午夜久久久精品| 91丨九色丨蝌蚪富婆spa| 小早川怜子一区二区的演员表| 黑人巨大精品欧美一区二区一视频 | 91porny在线| 日韩欧美专区在线| 69xxxx欧美| 国产精品成人播放| 你懂的在线观看一区二区| 7777在线视频| 美女视频黄久久| 成年人免费观看视频网站| 婷婷综合另类小说色区| 国产福利免费视频| 日韩最新中文字幕电影免费看| 僵尸再翻生在线观看免费国语| 999精品视频一区二区三区| 99久久久久| 天堂av在线网站| 久久精品亚洲麻豆av一区二区 | 国产精品午夜av在线| 91超碰成人| 伊人影院综合在线| 亚洲国产电影在线观看| 五月婷婷激情五月| 亚洲乱码国产乱码精品精天堂| 成人bbav| 国产私拍一区| 99亚洲一区二区| 日本美女视频网站| 亚洲一区在线看| 亚洲精品字幕在线| 欧美黑人狂野猛交老妇| 日韩视频在线直播| a级片一区二区| 高清av一区二区| 久久精品免费av| 亚洲成年人在线| 欧美巨大丰满猛性社交| 精品国产乱码久久久久久郑州公司| 狠狠入ady亚洲精品| 佐佐木明希电影| 调教+趴+乳夹+国产+精品| 色综合视频在线| 日本国产精品视频| 狠狠色狠狠色综合婷婷tag| 91国产精品视频在线观看| 欧美极品美女视频| 一级片aaaa| 精品中文字幕在线观看| 1769国产精品视频| 国产一区二区视频播放| 91一区二区在线| 91在线视频免费播放| 一区二区三区天堂av| 亚洲一区导航| 欧美日韩午夜爽爽| 99精品欧美一区二区三区小说| 天天干天天干天天干天天| 亚洲色图第三页| 亚洲91在线| 成年人网站国产| 久久综合色播五月| 中文字幕av久久爽| 欧美成人精品三级在线观看| 国产精品男女| 91淫黄看大片| 亚洲人精品午夜| 色婷婷视频在线| 国产精品久久久久久av福利| 午夜影院欧美| 波多野结衣视频播放| 欧美亚洲一区二区在线| 国产福利在线播放麻豆| 国产精品一区视频| 蜜臀av一区二区在线免费观看 | 美女100%无挡| 欧美一区二区三区免费视频 | 国产精品无码电影| 欧美视频一二三区| 国产精品探花在线| 日本免费高清一区| 国产一区二区在线免费观看| 久久国产精品免费看| 久久综合久久八八| 婷婷精品在线| 在线视频日韩欧美| 日韩欧美成人精品| 91精品久久| 日韩精品久久久免费观看| 国产成人久久精品77777最新版本| 亚洲精品午夜国产va久久成人| 久久伊人免费视频| 欧美极品中文字幕| 亚洲国产精品狼友在线观看|