婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang操作MySql數據庫的完整步驟記錄

Golang操作MySql數據庫的完整步驟記錄

熱門標簽:利用地圖標注位置 谷歌美發店地圖標注 400開頭電話怎樣申請 杭州人工智能電銷機器人費用 地圖區域圖標注后導出 官渡電銷外呼管理系統怎么收費 赤峰電銷 江蘇呼叫中心外呼系統有效果嗎 貴州電話智能外呼系統

前言

MySQL是業界常用的關系型數據庫,在平時開發中會經常與MySql數據庫打交道,所以在接下來將介紹怎么使用Go語言操作MySql數據庫。

下載MySql連接驅動

Go語言中的database/sql包提供了保證SQL或類SQL數據庫的泛用接口,并不提供具體的數據庫驅動。使用database/sql包時必須注入(至少)一個數據庫驅動。

我們常用的數據庫基本上都有完整的第三方實現。比如:MySQL驅動

**下載依賴**

go get -u github.com/go-sql-driver/mysql

**使用MySql驅動** 

func Open(driverName, dataSourceName string) (*DB, error)

Open打開一個dirverName指定的數據庫,dataSourceName指定數據源,一般至少包括數據庫文件名和其它連接必要的信息。

示例代碼:

import ( "database/sql"​ _ "github.com/go-sql-driver/mysql")​func main() { // DSN:Data Source Name dsn := "user:password@tcp(127.0.0.1:3306)/dbname" db, err := sql.Open("mysql", dsn) if err != nil { panic(err) } defer db.Close() // 注意這行代碼要寫在上面err判斷的下面}

初始化連接

Open函數可能只是驗證其參數格式是否正確,實際上并不創建與數據庫的連接。如果要檢查數據源的名稱是否真實有效,應該調用Ping方法。

返回的DB對象可以安全地被多個goroutine并發使用,并且維護其自己的空閑連接池。因此,Open函數應該僅被調用一次,很少需要關閉這個DB對象。

示例代碼如下:

// 定義一個全局對象dbvar db *sql.DB​// 定義一個初始化數據庫的函數func initDB() (err error) { // DSN:Data Source Name dsn := "user:password@tcp(127.0.0.1:3306)/sql_test?charset=utf8mb4parseTime=True" // 不會校驗賬號密碼是否正確 // 注意!!!這里不要使用:=,我們是給全局變量賦值,然后在main函數中使用全局變量db db, err = sql.Open("mysql", dsn) if err != nil { return err } // 嘗試與數據庫建立連接(校驗dsn是否正確) err = db.Ping() if err != nil { return err } return nil}​func main() { err := initDB() // 調用輸出化數據庫的函數 if err != nil { fmt.Printf("init db failed,err:%v\n", err) return }}

其中sql.DB是表示連接的數據庫對象(結構體實例),它保存了連接數據庫相關的所有信息。它內部維護著一個具有零到多個底層連接的連接池,它可以安全地被多個goroutine同時使用。

**設置最大連接數**

func (db *DB) SetMaxOpenConns(n int)

SetMaxOpenConns設置與數據庫建立連接的最大數目。如果n大于0且小于最大閑置連接數,會將最大閑置連接數減小到匹配最大開啟連接數的限制。如果n=0,不會限制最大開啟連接數,默認為0(無限制)。

**設置最大閑置連接數**

func (db *DB) SetMaxIdleConns(n int)

SetMaxIdleConns設置連接池中的最大閑置連接數。如果n大于最大開啟連接數,則新的最大閑置連接數會減小到匹配最大開啟連接數的限制。如果n=0,不會保留閑置連接。

MySql建庫建表

我們先在MySQL中創建一個名為`sql_test`的數據庫:

CREATE DATABASE sql_test;

進入該數據庫:

use sql_test;

執行以下命令創建一張用于測試的數據表:

CREATE TABLE `user` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `name` VARCHAR(20) DEFAULT '', `age` INT(11) DEFAULT '0', PRIMARY KEY(`id`))ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

操作MySql查詢

為了方便查詢,我們事先定義好一個結構體來存儲user表的數據。

type user struct { id int age int name string}

**單行查詢**

單行查詢`db.QueryRow()`執行一次查詢,并期望返回最多一行結果(即Row)。QueryRow總是返回非nil的值,直到返回值的Scan方法被調用時,才會返回被延遲的錯誤。(如:未找到結果)

func (db *DB) QueryRow(query string, args ...interface{}) *Row

示例代碼: 

// 查詢單條數據示例func queryRowDemo() { sqlStr := "select id, name, age from user where id=?" var u user // 非常重要:確保QueryRow之后調用Scan方法,否則持有的數據庫鏈接不會被釋放 err := db.QueryRow(sqlStr, 1).Scan(u.id, u.name, u.age) if err != nil { fmt.Printf("scan failed, err:%v\n", err) return } fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)}

**多行查詢**

多行查詢db.Query()執行一次查詢,返回多行結果(即Rows),一般用于執行select命令。參數args表示query中的占位參數。

func (db *DB) Query(query string, args ...interface{}) (*Rows, error)

示例代碼:

// 查詢多條數據示例func queryMultiRowDemo() { sqlStr := "select id, name, age from user where id > ?" rows, err := db.Query(sqlStr, 0) if err != nil { fmt.Printf("query failed, err:%v\n", err) return } // 非常重要:關閉rows釋放持有的數據庫鏈接 defer rows.Close()​ // 循環讀取結果集中的數據 for rows.Next() { var u user err := rows.Scan(u.id, u.name, u.age) if err != nil {  fmt.Printf("scan failed, err:%v\n", err)  return } fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age) }}

操作MySql插入數據

插入、更新和刪除操作都使用Exec方法。

func (db *DB) Exec(query string, args ...interface{}) (Result, error)

Exec執行一次命令(包括查詢、刪除、更新、插入等),返回的Result是對已執行的SQL命令的總結。參數args表示query中的占位參數。

具體插入數據示例代碼如下:

// 插入數據func insertRowDemo() { sqlStr := "insert into user(name, age) values (?,?)" ret, err := db.Exec(sqlStr, "王五", 38) if err != nil { fmt.Printf("insert failed, err:%v\n", err) return } theID, err := ret.LastInsertId() // 新插入數據的id if err != nil { fmt.Printf("get lastinsert ID failed, err:%v\n", err) return } fmt.Printf("insert success, the id is %d.\n", theID)}

操作MySql更新數據

具體更新數據示例代碼如下:

// 更新數據func updateRowDemo() { sqlStr := "update user set age=? where id = ?" ret, err := db.Exec(sqlStr, 39, 3) if err != nil { fmt.Printf("update failed, err:%v\n", err) return } n, err := ret.RowsAffected() // 操作影響的行數 if err != nil { fmt.Printf("get RowsAffected failed, err:%v\n", err) return } fmt.Printf("update success, affected rows:%d\n", n)}

操作MySql刪除數據

具體刪除數據的示例代碼如下:

// 刪除數據func deleteRowDemo() { sqlStr := "delete from user where id = ?" ret, err := db.Exec(sqlStr, 3) if err != nil { fmt.Printf("delete failed, err:%v\n", err) return } n, err := ret.RowsAffected() // 操作影響的行數 if err != nil { fmt.Printf("get RowsAffected failed, err:%v\n", err) return } fmt.Printf("delete success, affected rows:%d\n", n)}

SQL注入安全問題

我們任何時候都不應該自己拼接SQL語句!

這里我們演示一個自行拼接SQL語句的示例,編寫一個根據name字段查詢user表的函數如下:

// sql注入示例func sqlInjectDemo(name string) { sqlStr := fmt.Sprintf("select id, name, age from user where name='%s'", name) fmt.Printf("SQL:%s\n", sqlStr) var u user err := db.QueryRow(sqlStr).Scan(u.id, u.name, u.age) if err != nil { fmt.Printf("exec failed, err:%v\n", err) return } fmt.Printf("user:%#v\n", u)}

此時以下輸入字符串都可以引發SQL注入問題:

sqlInjectDemo("xxx' or 1=1#")sqlInjectDemo("xxx' union select * from user #")sqlInjectDemo("xxx' and (select count(*) from user) 10 #")

完整示例代碼歸檔GitHub

Golang操作MySql數據庫示例代碼

到此這篇關于Golang操作MySql數據庫的完整步驟記錄的文章就介紹到這了,更多相關Golang操作MySql數據庫內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • golang 通過ssh代理連接mysql的操作
  • golang中連接mysql數據庫
  • golang實現mysql數據庫事務的提交與回滾

標簽:松原 宜春 鷹潭 河池 泰安 黔西 保定 武漢

巨人網絡通訊聲明:本文標題《Golang操作MySql數據庫的完整步驟記錄》,本文關鍵詞  Golang,操作,MySql,數據庫,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang操作MySql數據庫的完整步驟記錄》相關的同類信息!
  • 本頁收集關于Golang操作MySql數據庫的完整步驟記錄的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产视频一区在线观看| 不卡高清视频专区| 欧美日韩精品一区二区| 精品一区二区三区的国产在线播放| 欧美xxxxxxxxx| 日本高清不卡aⅴ免费网站| 国产高清不卡一区| 精品一二三四区| 欧美精品一区二区不卡| 91久久精品一区二区三| 国产成人精品www牛牛影视| 婷婷夜色潮精品综合在线| 中文字幕一区在线| 亚洲乱码日产精品bd| 亚洲一区二区影院| 午夜精品久久久久久久久久| 亚洲第一福利视频在线| 亚洲电影一区二区三区| 毛片av一区二区三区| 蜜桃视频一区二区三区在线观看| 视频在线观看一区二区三区| 精品国一区二区三区| 欧美精品一区二区高清在线观看| 欧美大黄免费观看| 国产精品美女久久久久av爽李琼| 国产精品久久久久桃色tv| 亚洲自拍与偷拍| 狠狠色丁香婷婷综合久久片| 成人一级视频在线观看| 欧美亚洲图片小说| 这里只有精品电影| 国产欧美日韩视频在线观看| 国产精品白丝在线| 国产乱子伦一区二区三区国色天香| 国产丶欧美丶日本不卡视频| proumb性欧美在线观看| 日韩精品一区二区三区中文不卡 | 亚洲欧美区自拍先锋| 亚洲精品福利视频网站| 国产精品夜夜嗨| 欧美精品自拍偷拍| 亚洲欧美另类久久久精品| 国产精品一区二区黑丝| 久久99在线观看| 国产嫩草影院久久久久| 成人app在线观看| 亚洲国产人成综合网站| 欧美大胆一级视频| 色综合中文综合网| 黄页网站大全一区二区| 欧美大片在线观看一区| eeuss鲁片一区二区三区| 国产精品久久久久久久久免费樱桃 | 一本到不卡精品视频在线观看| 精品美女被调教视频大全网站| 亚洲欧美国产三级| 欧洲精品视频在线观看| 亚洲日本在线天堂| 欧美性感一类影片在线播放| 亚洲一区在线观看视频| 777色狠狠一区二区三区| 免费高清在线视频一区·| 56国语精品自产拍在线观看| 亚洲国产精品久久艾草纯爱 | 国产色综合久久| 国产精品99久久久久久久vr | 日韩一卡二卡三卡四卡| 午夜精品久久久久久久久| 精品久久五月天| 欧美午夜片在线观看| 轻轻草成人在线| 亚洲天堂免费看| 精品国产青草久久久久福利| 成人av影院在线| 日韩国产在线观看一区| 久久日韩精品一区二区五区| 成人avav影音| 国产成人欧美日韩在线电影| 亚洲国产cao| 伊人婷婷欧美激情| 亚洲欧洲精品天堂一级| 91精品久久久久久久久99蜜臂| 色哦色哦哦色天天综合| 亚洲视频狠狠干| 亚洲一区二区三区激情| 天堂一区二区在线| 亚洲成人一区二区在线观看| 最新久久zyz资源站| 国产精品久久夜| 国产精品乱码一区二区三区软件 | 日韩午夜精品视频| 日本韩国一区二区三区视频| 国产一区不卡视频| 日本vs亚洲vs韩国一区三区| 亚洲综合激情小说| 亚洲欧洲精品一区二区三区| 久久日韩粉嫩一区二区三区| 欧美日韩色一区| 777久久久精品| 日韩午夜精品视频| ww亚洲ww在线观看国产| 精品处破学生在线二十三| 精品99久久久久久| 国产精品免费观看视频| 亚洲色图一区二区| 亚洲成人福利片| 蜜臀av性久久久久蜜臀aⅴ| 中文字幕综合网| 亚洲国产精品久久久久秋霞影院| 亚洲福利视频导航| 玖玖九九国产精品| 风间由美一区二区三区在线观看| 丰满亚洲少妇av| 欧美精品久久一区二区三区| 欧美不卡一区二区三区四区| 国产日韩欧美a| 亚洲精品高清在线观看| 欧美中文字幕一区| 色综合色综合色综合色综合色综合 | 性久久久久久久| 成人精品国产免费网站| 欧美日韩在线免费视频| 中文字幕精品一区| 韩国av一区二区| 日韩欧美中文字幕一区| 亚洲第一主播视频| 欧美日韩dvd在线观看| 亚洲综合在线电影| 91网站最新地址| 国产精品成人在线观看| 久久久综合激的五月天| 日韩精品一二区| 99精品一区二区| 国产精品久久久久毛片软件| 国产精品66部| 国产精品激情偷乱一区二区∴| 裸体一区二区三区| 欧美成人一区二区三区在线观看| 亚洲一区在线播放| 欧美精品一卡二卡| 日韩视频一区二区三区在线播放 | 国产成人av电影在线| 欧美tickling网站挠脚心| 国产精品天天看| 色视频一区二区| 国产一区不卡在线| 一区二区三区欧美久久| 国产成人欧美日韩在线电影| 精品久久人人做人人爱| 国产精品免费免费| 欧美一区二区三区视频在线观看| 日韩黄色小视频| 亚瑟在线精品视频| 北岛玲一区二区三区四区| 欧美性大战久久| 国产日产精品一区| 亚洲国产日韩a在线播放性色| **网站欧美大片在线观看| 久久精品久久久精品美女| 色欧美乱欧美15图片| 久久精品在线观看| 日日夜夜精品视频天天综合网| 久久99精品网久久| 欧美色精品在线视频| 在线免费观看成人短视频| 久久精品欧美一区二区三区不卡| 国产精品中文字幕欧美| 国产亚洲欧美色| 欧美日韩亚洲综合一区| 免费看欧美女人艹b| 久久久高清一区二区三区| 成人污污视频在线观看| 91丨国产丨九色丨pron| 色哟哟欧美精品| 欧美激情艳妇裸体舞| 免费精品99久久国产综合精品| 波多野结衣亚洲| 一区精品在线播放| 久久国产精品72免费观看| 欧美性大战久久久| 亚洲成人黄色影院| 免费成人av资源网| 欧美剧在线免费观看网站| 色网站国产精品| 白白色亚洲国产精品| 国产成人精品亚洲午夜麻豆| 国产一区二区三区在线观看免费视频 | 欧美大片免费久久精品三p| 最近日韩中文字幕| 欧美日韩国产另类一区| 久久99在线观看| 一区二区在线观看免费视频播放| 亚洲特黄一级片| 7777精品伊人久久久大香线蕉完整版 | 国产精品一二三区在线| 日韩免费电影一区| 日韩福利电影在线| 国产精品色婷婷| 国产999精品久久久久久绿帽| 国产精品久久二区二区|