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

Golang如何優雅連接MySQL數據庫?

數據庫 MySQL
Go原生就支持連接數據庫,所以在使用 Golang 開發時,當需要數據庫交互時,即可使用database/sql包。

 Go原生就支持連接數據庫,所以在使用 Golang 開發時,當需要數據庫交互時,即可使用database/sql包。


在Go中訪問DB需用sql.DB接口:可創建語句(statement)和事務(transaction),執行查詢,獲取結果。

使用DB時,除database/sql包,還需引入想使用的特定DB驅動。官方不提供實現,需要先下載三方實現,點擊這里查看各種各樣的實現版本。

通常DB選型MySQL,所以選型驅動為:github.com/go-sql-driver/mysql,需引入包:

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

 包名前的"_" 

import 下劃線(如:import _ github/demo)的作用:當導入一個包時,該包下的文件里所有init()函數都會被執行,然而,有些時候我們并不需要把整個包都導入進來,僅僅是是希望它執行init()函數而已。這個時候就可以使用 import _ 引用該包。

上面的MySQL驅動中引入的就是MySQL包中各個init()方法,你無法通過包名來調用包中的其他函數。導入時,驅動的初始化函數會調用sql.Register將自己注冊在database/sql包的全局變量sql.drivers中,以便以后通過sql.Open訪問。

 案例用數據表

 初始化數據庫連接[[353659]] 

 sql.Open()中的數據庫連接串格式為:"用戶名:密碼@tcp(IP:端口)/數據庫?charset=utf8"。DB的類型為:*sql.DB,有DB后即可執行CRUD。

Go將數據庫操作分為兩類:Query與Exec

  • Query表示查詢,它會從數據庫獲取查詢結果(一系列行,可能為空)。
  • Exec表示執行語句,它不會返回行。

常見數據庫操作模式:

  • QueryRow只返回一行的查詢,作為Query的一個常見特例。
  • Prepare準備一個需要多次使用的語句,供后續執行用。

查詢操作

  1. var user User 
  2. rows, e := DB.Query("select * from user where id in (1,2,3)"
  3. if e == nil { 
  4.     errors.New("query incur error"
  5. for rows.Next(){ 
  6.     e := rows.Scan(user.sex, user.phone, user.nameuser.id,  
  7.       user.age) 
  8.     if e != nil{ 
  9.         fmt.Println(json.Marshal(user)) 
  10.     } 
  11. rows.Close() 
  12. // 單行查詢操作 
  13. DB.QueryRow("select * from user where id=1").Scan(user.age,  
  14.   user.id, user.nameuser.phone, user.sex) 

執行流程 

  1. 使用db.Query()來發送查詢到數據庫,獲取結果集Rows,并檢查錯誤。
  2. 使用rows.Next()作為循環條件,迭代讀取結果集。
  3. 使用rows.Scan從結果集中獲取一行結果。
  4. 使用rows.Err()在退出迭代后檢查錯誤。
  5. 使用rows.Close()關閉結果集,釋放連接。

增刪改和Exec

通常不會約束你查詢必須用Query,只是Query會返回結果集,而Exec不會返回。所以如果你執行的是增刪改操作一般用Exec會好一些。Exec返回的結果是Result,Result接口允許獲取執行結果的元數據:

  1. type Result interface { 
  2.     // 用于返回自增ID,并不是所有的關系型數據庫都有這個功能。 
  3.     LastInsertId() (int64, error) 
  4.     // 返回受影響的行數。 
  5.     RowsAffected() (int64, error) 

 準備查詢

如果你現在想使用占位符的功能,where 的條件想以參數的形式傳入,Go提供了db.Prepare語句來幫你綁定。準備查詢的結果是一個準備好的語句(prepared statement),語句中可以包含執行時所需參數的占位符(即綁定值)。準備查詢比拼字符串的方式好很多,它可以轉義參數,避免SQL注入。同時,準備查詢對于一些數據庫也省去了解析和生成執行計劃的開銷,有利于性能。

占位符

PostgreSQL使用$N作為占位符,N是一個從1開始遞增的整數,代表參數的位置,方便參數的重復使用。MySQL使用?作為占位符,SQLite兩種占位符都可以,而Oracle則使用:param1的形式。

  1. MySQL               PostgreSQL            Oracle 
  2. =====               ==========            ====== 
  3. WHERE col = ?       WHERE col = $1        WHERE col = :col 
  4. VALUES(?, ?, ?)     VALUES($1, $2, $3)    VALUES(:val1, :val2, :val3) 
  5. stmt, e := DB.Prepare("select * from user where id=?"
  6. query, e := stmt.Query(1) 
  7. query.Scan() 

 事務的使用

通過db.Begin()來開啟一個事務,Begin方法會返回一個事務對象Tx。在結果變量Tx上調用Commit()或者Rollback()方法會提交或回滾變更,并關閉事務。在底層,Tx會從連接池中獲得一個連接并在事務過程中保持對它的獨占。事務對象Tx上的方法與數據庫對象sql.DB的方法一一對應,例如Query,Exec等。事務對象也可以準備(prepare)查詢,由事務創建的準備語句會顯式綁定到創建它的事務。

  1. //開啟事務 
  2. tx, err := DB.Begin() 
  3. if err != nil { 
  4.     fmt.Println("tx fail"
  5. //準備sql語句 
  6. stmt, err := tx.Prepare("DELETE FROM user WHERE id = ?"
  7. if err != nil { 
  8.     fmt.Println("Prepare fail"
  9.     return false 
  10. //設置參數以及執行sql語句 
  11. res, err := stmt.Exec(user.id) 
  12. if err != nil { 
  13.     fmt.Println("Exec fail"
  14.     return false 
  15. //提交事務 
  16. tx.Commit() 
  17.  
  18. 我們來一個完整的sql操作:package main 
  19.  
  20. import ( 
  21.     "database/sql" 
  22.     "encoding/json" 
  23.     "fmt" 
  24.     _ "github.com/go-sql-driver/mysql" 
  25.     "github.com/pkg/errors" 
  26.     "strings" 
  27.  
  28. //數據庫配置 
  29. const ( 
  30.     userName = "root" 
  31.     password = "123456" 
  32.     ip       = "127.0.0.1" 
  33.     port     = "3306" 
  34.     dbName   = "test" 
  35.  
  36. //Db數據庫連接池 
  37. var DB *sql.DB 
  38.  
  39. type User struct { 
  40.     id    int64 
  41.     name  string 
  42.     age   int8 
  43.     sex   int8 
  44.     phone string 
  45.  
  46. //注意方法名大寫,就是public 
  47. func InitDB() { 
  48.     //構建連接:"用戶名:密碼@tcp(IP:端口)/數據庫?charset=utf8" 
  49.     path := strings.Join([]string{userName, ":"password"@tcp(", ip, ":", port, ")/", dbName, "?charset=utf8"}, ""
  50.     //打開數據庫,前者是驅動名,所以要導入:_ "github.com/go-sql-driver/mysql" 
  51.     DB, _ = sql.Open("mysql", path) 
  52.     //設置數據庫最大連接數 
  53.     DB.SetConnMaxLifetime(100) 
  54.     //設置上數據庫最大閑置連接數 
  55.     DB.SetMaxIdleConns(10) 
  56.     //驗證連接 
  57.     if err := DB.Ping(); err != nil { 
  58.         fmt.Println("open database fail"
  59.         return 
  60.     } 
  61.     fmt.Println("connnect success"
  62.  
  63. //查詢操作 
  64. func Query() { 
  65.     var user User 
  66.     rows, e := DB.Query("select * from user where id in (1,2,3)"
  67.     if e == nil { 
  68.         errors.New("query incur error"
  69.     } 
  70.     for rows.Next() { 
  71.         e := rows.Scan(user.sex, user.phone, user.nameuser.id, user.age) 
  72.         if e != nil { 
  73.             fmt.Println(json.Marshal(user)) 
  74.         } 
  75.     } 
  76.     rows.Close() 
  77.     DB.QueryRow("select * from user where id=1").Scan(user.age, user.id, user.nameuser.phone, user.sex) 
  78.  
  79.     stmt, e := DB.Prepare("select * from user where id=?"
  80.     query, e := stmt.Query(1) 
  81.     query.Scan() 
  82.  
  83. func DeleteUser(user User) bool { 
  84.     //開啟事務 
  85.     tx, err := DB.Begin() 
  86.     if err != nil { 
  87.         fmt.Println("tx fail"
  88.     } 
  89.     //準備sql語句 
  90.     stmt, err := tx.Prepare("DELETE FROM user WHERE id = ?"
  91.     if err != nil { 
  92.         fmt.Println("Prepare fail"
  93.         return false 
  94.     } 
  95.     //設置參數以及執行sql語句 
  96.     res, err := stmt.Exec(user.id) 
  97.     if err != nil { 
  98.         fmt.Println("Exec fail"
  99.         return false 
  100.     } 
  101.     //提交事務 
  102.     tx.Commit() 
  103.     //獲得上一個insert的id 
  104.     fmt.Println(res.LastInsertId()) 
  105.     return true 
  106.  
  107. func InsertUser(user User) bool { 
  108.     //開啟事務 
  109.     tx, err := DB.Begin() 
  110.     if err != nil { 
  111.         fmt.Println("tx fail"
  112.         return false 
  113.     } 
  114.     //準備sql語句 
  115.     stmt, err := tx.Prepare("INSERT INTO user (`name`, `phone`) VALUES (?, ?)"
  116.     if err != nil { 
  117.         fmt.Println("Prepare fail"
  118.         return false 
  119.     } 
  120.     //將參數傳遞到sql語句中并且執行 
  121.     res, err := stmt.Exec(user.nameuser.phone) 
  122.     if err != nil { 
  123.         fmt.Println("Exec fail"
  124.         return false 
  125.     } 
  126.     //將事務提交 
  127.     tx.Commit() 
  128.     //獲得上一個插入自增的id 
  129.     fmt.Println(res.LastInsertId()) 
  130.     return true 
  131.  
  132. func main() { 
  133.     InitDB() 
  134.     Query() 
  135.     defer DB.Close() 

參考

https://www.cnblogs.com/rickiyang/p/11074180.html

 

責任編輯:姜華 來源: JavaEdge
相關推薦

2010-05-14 11:12:16

連接MySql

2009-11-24 16:48:15

PHP mysqli

2021-08-02 10:53:28

PythonMySQL數據庫

2017-09-11 19:30:44

MySQLCmd命令連接數據庫

2009-06-01 09:57:43

netbeans連接數netbeans數據庫netbeans連接m

2009-07-07 14:56:33

JSP連接MySQL

2018-02-26 20:00:00

編程語言JavaMySQL

2020-09-22 15:56:31

Java

2011-05-26 13:42:50

MFC連接MySql數據庫

2011-07-27 13:58:48

EclipseMySQL

2024-08-19 11:45:18

2017-11-27 11:41:06

python數據庫數據分析

2024-01-02 08:47:42

2023-08-29 07:35:15

2010-06-07 15:24:34

Java連接MYSQL

2024-12-04 16:12:31

2011-07-05 10:16:16

Qt 數據庫 SQLite

2011-04-01 12:32:37

aspaccess數據庫

2015-10-30 14:00:33

adosybaseodbc

2024-05-28 00:00:30

Golang數據庫
點贊
收藏

51CTO技術棧公眾號

chinese少妇国语对白| 精品日韩电影| 国产一级理论片| 一区二区美女| 8v天堂国产在线一区二区| 久久久久久久香蕉| 你懂的在线观看| 国内成人精品2018免费看| 国内精久久久久久久久久人| 大又大又粗又硬又爽少妇毛片| 成人黄色毛片| 午夜精品一区二区三区免费视频 | 性欧美亚洲xxxx乳在线观看| 永久免费成人代码| 豆花视频一区二区| 欧美日韩不卡一区二区| 国产精品50p| 18av在线播放| 国产欧美一区二区三区在线看蜜臀 | 精品欧美一区二区三区在线观看| 一区二区三区在线观看欧美| 日本在线一区| 亚洲人视频在线观看| 国产乱子轮精品视频| 国产精品三级美女白浆呻吟| 日韩成人免费在线视频| 天天综合国产| 在线日韩中文字幕| 亚洲精品乱码久久| 亚洲**毛片| 制服丝袜亚洲播放| 国内自拍视频网| 成人免费网站视频| 亚洲动漫第一页| 激情视频小说图片| 嫩草在线视频| 国产精品国产三级国产aⅴ原创 | 欧美三级小说| 久久精品久久久久久| 熟女少妇内射日韩亚洲| 在线日本制服中文欧美| 亚洲美女黄色片| 丰满大乳奶做爰ⅹxx视频| 我要色综合中文字幕| 91精品午夜视频| 国产成人在线综合| 国产精品第一| 欧美日韩精品专区| 久久黄色片网站| 四虎精品一区二区免费| 欧美老人xxxx18| wwwwwxxxx日本| 婷婷久久免费视频| 在线播放欧美女士性生活| 中文字幕 91| 欧洲亚洲精品久久久久| 欧美男生操女生| 日韩精品aaa| 视频一区日韩| 亚洲成人久久久久| 日本黄色录像片| 台湾佬综合网| 国产亚洲欧美一区| 欧美aaa级片| 久久免费av| 久久伊人精品天天| 免费人成视频在线| 亚洲精华国产欧美| 欧美洲成人男女午夜视频| 日韩综合在线观看| 蜜乳av一区二区三区| 国产一区玩具在线观看| 精品人妻久久久久一区二区三区 | 欧美亚洲国产免费| yw在线观看| 日韩一区有码在线| 国产一二三区在线播放| 牛牛精品一区二区| 在线国产电影不卡| 久久出品必属精品| 精品久久ai| 一区二区欧美在线| 婷婷色中文字幕| 99精品欧美| 国产精品久久久久久亚洲影视| 国产视频aaa| 99精品视频中文字幕| 日日夜夜精品网站| 性欧美1819sex性高清大胸| 午夜精品一区二区三区电影天堂| 日本女优爱爱视频| 日本99精品| 亚洲女人天堂成人av在线| 熟女少妇a性色生活片毛片| 亚洲国产精品第一区二区三区| 国产成人精品亚洲精品| 午夜精品久久久久久久99热黄桃| 久久综合久久综合久久综合| 超碰成人在线免费观看| 亚洲第一av| 日韩视频一区在线观看| 亚洲中文字幕一区| 小说区亚洲自拍另类图片专区 | 亚洲成人动漫在线| 美女高潮在线观看| 91麻豆精品国产91久久久资源速度| 丰满岳乱妇一区二区| 成人一区而且| 蜜臀久久99精品久久久无需会员| 丁香社区五月天| 国产成人aaa| 一区二区三区的久久的视频| 黄色漫画在线免费看| 欧美高清www午色夜在线视频| 中文字幕5566| 国内精品久久久久久久影视蜜臀| 国产精品wwww| 青青国产在线| 亚洲不卡在线观看| 91亚洲一区二区| 成人3d动漫在线观看| 97久久伊人激情网| 精品人妻aV中文字幕乱码色欲| 中文字幕精品一区二区精品绿巨人 | 欧美成人在线免费观看| 免费电影网站在线视频观看福利| 欧美日韩精品一区二区| 久久久久久久久久久久久久久| 亚洲二区免费| 国产精选一区二区| 国产91xxx| 这里只有精品丝袜| 久久这里只有精品免费| 老司机一区二区| 欧美精品v日韩精品v国产精品| 丰满的护士2在线观看高清| 欧美美女一区二区三区| 久久视频一区二区三区| 久久一二三四| 欧美人与物videos另类| аⅴ资源天堂资源库在线| 日韩女同互慰一区二区| 亚洲成人生活片| 国产一区二区三区高清播放| 一区二区三区四区不卡| 伊人久久大香| 久久久999成人| 国产精品无码专区av免费播放| 国产精品无人区| 校园春色 亚洲色图| 欧美午夜精彩| 国产在线a不卡| av在线影院| 欧美va亚洲va| 青青国产在线观看| 99精品视频在线播放观看| 精品国产免费av| 亚洲人成网站77777在线观看| 全亚洲最色的网站在线观看| 成年人在线视频| 欧美情侣在线播放| 青草影院在线观看| 大桥未久av一区二区三区中文| 亚洲精品蜜桃久久久久久| 丝袜久久网站| 国产精品成人播放| 蜜桃av在线免费观看| 日韩一区二区三免费高清| 国产第一页在线播放| 99久久婷婷国产综合精品电影| 欧美两根一起进3p做受视频| 日韩精品一区二区久久| 亚洲综合色激情五月| 91九色美女在线视频| 亚洲欧美日韩中文视频| 国产成人精品一区二区色戒| 亚洲精品免费在线播放| 性欧美丰满熟妇xxxx性久久久| 丝瓜av网站精品一区二区| 亚洲一区二区三区在线观看视频 | 欧美性猛交xxxx乱大交| 免费看黄色av| 国产精品综合二区| 国产乱子伦农村叉叉叉| 久久五月天小说| 成人在线看片| 色8久久影院午夜场| 久久精品国产亚洲精品| 四季av日韩精品一区| 欧美在线观看视频一区二区三区| 欧美激情图片小说| 久久综合精品国产一区二区三区| 国产精品嫩草影院8vv8| 亚洲激情专区| 91免费视频黄| 亚洲盗摄视频| 91丨九色丨国产| 成人黄色在线| 欧美亚洲免费电影| av在线官网| 亚洲最新在线视频| 人妻丰满熟妇av无码区hd| 欧美吻胸吃奶大尺度电影| 日本少妇性高潮| 亚洲免费在线观看| 国产一二三四五区| 成人国产精品免费观看视频| 天天干天天av| 日韩精品每日更新| 欧美深夜福利视频| 欧美暴力喷水在线| 亚洲国产精品视频一区| 日韩激情毛片| 国产91精品入口17c| 日本一区二区三区中文字幕 | 日韩成人综合网站| 日本精品一区二区三区在线播放视频 | 美女毛片一区二区三区四区| 丁香五月网久久综合| 9999精品视频| 国产精品天天狠天天看| 丝袜美腿一区| 91大神在线播放精品| 免费av不卡在线观看| 欧美另类在线播放| 欧美猛烈性xbxbxbxb| 国产一区二区三区视频| 视频二区在线| 日韩精品免费在线视频| 亚洲精品国偷拍自产在线观看蜜桃| 欧美剧情电影在线观看完整版免费励志电影 | 色中色一区二区| 成人免费区一区二区三区| 亚洲一区二区三区精品在线| 国产高潮国产高潮久久久91| 国产精品久久久久永久免费观看 | 91午夜在线播放| 免费成人毛片| 国产精选久久久久久| 另类一区二区| 成人激情在线播放| 天堂综合在线播放| 成人国产精品av| 欧美亚洲黄色| 2022国产精品| 99精品在免费线中文字幕网站一区| 亚洲综合在线播放| 成人三级av在线| 国内精品二区| 亚洲va久久| 日本免费一区二区三区| av亚洲在线观看| 在线电影看在线一区二区三区| 99热精品久久| 穿情趣内衣被c到高潮视频| 女生裸体视频一区二区三区| 97视频在线免费| 亚洲一区二区免费看| 国产v亚洲v天堂无码久久久| 日本不卡视频在线| 欧美视频国产视频| 国产成人午夜电影网| 精品人妻一区二区免费视频| 久久久99精品免费观看| 999久久久国产| 亚洲欧美日韩国产中文在线| 久久国产精品波多野结衣av| 欧美日韩精品中文字幕| 色老头在线视频| 欧美日本在线一区| 亚洲国产精品国自产拍久久| 亚洲精品www久久久久久广东| 欧美伦理影视网| 日韩中文在线视频| 午夜av在线播放| 欧美最近摘花xxxx摘花| 欧美综合影院| 精品一区日韩成人| 日韩精品欧美激情一区二区| 男人添女人下部视频免费| 99精品免费网| 99九九99九九九99九他书对| 成人毛片老司机大片| 欧美激情视频二区| 一区二区三区四区在线| 黄色av一级片| 日韩欧美视频在线| 欧美日韩影视| 久久大大胆人体| 日本电影欧美片| 99re视频在线播放| 欧美美女视频| 99视频在线免费播放| 九九精品视频在线看| 日韩片在线观看| 亚洲色图欧美在线| 中文字幕在线欧美| 日韩欧美一级二级三级| 国产精品毛片一区二区三区四区| 久久6精品影院| 亚洲精品555| 狠狠色综合色区| 亚洲成人tv| 日本熟妇人妻中出| 成人精品国产一区二区4080| 国产亚洲精品久久久久久豆腐| 欧美日韩美女视频| 国内精品偷拍视频| 中文字幕精品国产| 欧美亚洲韩国| 精品国产中文字幕| 欧美激情第8页| 17c国产在线| 国产欧美综合在线观看第十页 | 欧美区一区二区三区| 蜜芽tv福利在线视频| 久久久久久午夜| 日韩高清一区| 国产盗摄视频在线观看| 免费国产亚洲视频| 国产精品密蕾丝袜| 欧美天天综合色影久久精品| 国产探花精品一区二区| 中文字幕综合一区| 成人黄色免费短视频| 精品在线不卡| 尤物网精品视频| 国产乱国产乱老熟300部视频| 亚洲免费在线观看| 国产一区二区三区成人| 国产一区二区三区视频免费| 中文字幕一区久| 精品乱色一区二区中文字幕| 99国产成+人+综合+亚洲欧美| 少妇献身老头系列| 一区二区三区欧美| 精品久久久中文字幕人妻| www.亚洲一区| avtt久久| 日本高清xxxx| 国产成人精品免费视频网站| 日本天堂中文字幕| 日韩欧美一区二区视频| 在线观看小视频| 国产激情美女久久久久久吹潮| 精品动漫av| 成人午夜精品无码区| 亚洲福利视频一区二区| 五月天久久久久久| 欧美做受高潮1| 视频精品在线观看| 中文字幕在线导航| 最新国产の精品合集bt伙计| 国产强伦人妻毛片| 欧美福利小视频| 亚洲动漫在线观看| 99草草国产熟女视频在线| 欧美激情综合网| 国产裸体无遮挡| 久久久久久久国产精品| 日韩高清三区| 三级视频中文字幕| 亚洲男人电影天堂| 手机看片1024日韩| 国产精品第一视频| 91精品电影| 久久性爱视频网站| 一本色道久久综合亚洲精品按摩| av在线二区| 999视频在线免费观看| 日韩午夜激情| 日韩精品电影一区二区三区| 日韩天堂在线观看| 美女91在线看| 制服诱惑一区| 国产91丝袜在线18| 日本免费在线观看视频| 日韩在线免费av| 国产精品香蕉| 国产性生交xxxxx免费| 中文字幕综合网| 天堂成人在线| 国产欧美一区二区白浆黑人| 国内精品福利| avhd101老司机| 精品久久一区二区三区| 欧美xnxx| av免费观看国产| 亚洲欧洲无码一区二区三区| 乱精品一区字幕二区| 国产精品久久久久91| 欧美体内she精视频在线观看| 国产aⅴ激情无码久久久无码| 日韩欧美一区二区久久婷婷| 欧美香蕉视频| 成品人视频ww入口| 中文av字幕一区| 手机在线观看免费av| 成人免费在线视频网址| 免费永久网站黄欧美|