成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > Golang操作MySql數(shù)據(jù)庫(kù)的完整步驟記錄

Golang操作MySql數(shù)據(jù)庫(kù)的完整步驟記錄

熱門標(biāo)簽:利用地圖標(biāo)注位置 谷歌美發(fā)店地圖標(biāo)注 400開頭電話怎樣申請(qǐng) 杭州人工智能電銷機(jī)器人費(fèi)用 地圖區(qū)域圖標(biāo)注后導(dǎo)出 官渡電銷外呼管理系統(tǒng)怎么收費(fèi) 赤峰電銷 江蘇呼叫中心外呼系統(tǒng)有效果嗎 貴州電話智能外呼系統(tǒng)

前言

MySQL是業(yè)界常用的關(guān)系型數(shù)據(jù)庫(kù),在平時(shí)開發(fā)中會(huì)經(jīng)常與MySql數(shù)據(jù)庫(kù)打交道,所以在接下來將介紹怎么使用Go語(yǔ)言操作MySql數(shù)據(jù)庫(kù)。

下載MySql連接驅(qū)動(dòng)

Go語(yǔ)言中的database/sql包提供了保證SQL或類SQL數(shù)據(jù)庫(kù)的泛用接口,并不提供具體的數(shù)據(jù)庫(kù)驅(qū)動(dòng)。使用database/sql包時(shí)必須注入(至少)一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)。

我們常用的數(shù)據(jù)庫(kù)基本上都有完整的第三方實(shí)現(xiàn)。比如:MySQL驅(qū)動(dòng)

**下載依賴**

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

**使用MySql驅(qū)動(dòng)** 

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

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

示例代碼:

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函數(shù)可能只是驗(yàn)證其參數(shù)格式是否正確,實(shí)際上并不創(chuàng)建與數(shù)據(jù)庫(kù)的連接。如果要檢查數(shù)據(jù)源的名稱是否真實(shí)有效,應(yīng)該調(diào)用Ping方法。

返回的DB對(duì)象可以安全地被多個(gè)goroutine并發(fā)使用,并且維護(hù)其自己的空閑連接池。因此,Open函數(shù)應(yīng)該僅被調(diào)用一次,很少需要關(guān)閉這個(gè)DB對(duì)象。

示例代碼如下:

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

其中sql.DB是表示連接的數(shù)據(jù)庫(kù)對(duì)象(結(jié)構(gòu)體實(shí)例),它保存了連接數(shù)據(jù)庫(kù)相關(guān)的所有信息。它內(nèi)部維護(hù)著一個(gè)具有零到多個(gè)底層連接的連接池,它可以安全地被多個(gè)goroutine同時(shí)使用。

**設(shè)置最大連接數(shù)**

func (db *DB) SetMaxOpenConns(n int)

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

**設(shè)置最大閑置連接數(shù)**

func (db *DB) SetMaxIdleConns(n int)

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

MySql建庫(kù)建表

我們先在MySQL中創(chuàng)建一個(gè)名為`sql_test`的數(shù)據(jù)庫(kù):

CREATE DATABASE sql_test;

進(jìn)入該數(shù)據(jù)庫(kù):

use sql_test;

執(zhí)行以下命令創(chuàng)建一張用于測(cè)試的數(shù)據(jù)表:

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查詢

為了方便查詢,我們事先定義好一個(gè)結(jié)構(gòu)體來存儲(chǔ)user表的數(shù)據(jù)。

type user struct { id int age int name string}

**單行查詢**

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

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

示例代碼: 

// 查詢單條數(shù)據(jù)示例func queryRowDemo() { sqlStr := "select id, name, age from user where id=?" var u user // 非常重要:確保QueryRow之后調(diào)用Scan方法,否則持有的數(shù)據(jù)庫(kù)鏈接不會(huì)被釋放 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()執(zhí)行一次查詢,返回多行結(jié)果(即Rows),一般用于執(zhí)行select命令。參數(shù)args表示query中的占位參數(shù)。

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

示例代碼:

// 查詢多條數(shù)據(jù)示例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 } // 非常重要:關(guān)閉rows釋放持有的數(shù)據(jù)庫(kù)鏈接 defer rows.Close()​ // 循環(huán)讀取結(jié)果集中的數(shù)據(jù) 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插入數(shù)據(jù)

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

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

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

具體插入數(shù)據(jù)示例代碼如下:

// 插入數(shù)據(jù)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() // 新插入數(shù)據(jù)的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更新數(shù)據(jù)

具體更新數(shù)據(jù)示例代碼如下:

// 更新數(shù)據(jù)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() // 操作影響的行數(shù) if err != nil { fmt.Printf("get RowsAffected failed, err:%v\n", err) return } fmt.Printf("update success, affected rows:%d\n", n)}

操作MySql刪除數(shù)據(jù)

具體刪除數(shù)據(jù)的示例代碼如下:

// 刪除數(shù)據(jù)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() // 操作影響的行數(shù) if err != nil { fmt.Printf("get RowsAffected failed, err:%v\n", err) return } fmt.Printf("delete success, affected rows:%d\n", n)}

SQL注入安全問題

我們?nèi)魏螘r(shí)候都不應(yīng)該自己拼接SQL語(yǔ)句!

這里我們演示一個(gè)自行拼接SQL語(yǔ)句的示例,編寫一個(gè)根據(jù)name字段查詢user表的函數(shù)如下:

// 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)}

此時(shí)以下輸入字符串都可以引發(fā)SQL注入問題:

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

完整示例代碼歸檔GitHub

Golang操作MySql數(shù)據(jù)庫(kù)示例代碼

到此這篇關(guān)于Golang操作MySql數(shù)據(jù)庫(kù)的完整步驟記錄的文章就介紹到這了,更多相關(guān)Golang操作MySql數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • golang 通過ssh代理連接mysql的操作
  • golang中連接mysql數(shù)據(jù)庫(kù)
  • golang實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)事務(wù)的提交與回滾

標(biāo)簽:松原 宜春 鷹潭 河池 泰安 黔西 保定 武漢

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang操作MySql數(shù)據(jù)庫(kù)的完整步驟記錄》,本文關(guān)鍵詞  Golang,操作,MySql,數(shù)據(jù)庫(kù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang操作MySql數(shù)據(jù)庫(kù)的完整步驟記錄》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Golang操作MySql數(shù)據(jù)庫(kù)的完整步驟記錄的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    91社区视频在线观看| 亚洲成人网上| 亚洲乱亚洲乱妇| 久久久久久久极品内射| 中文字幕 日本| 人人鲁人人莫人人爱精品| 国产一区二区三区久久久久久久久| 国产在线播放一区二区| 无码少妇精品一区二区免费动态| 草b视频在线观看| 欧美不卡在线| 亚洲免费网站| 国产成人精品久久一区二区小说| 国产精品99一区二区三| xxxx在线视频| 污污视频在线免费观看| 在线观看你懂的视频| 日本精品二区| 亚洲色图久久久| 超碰超碰人人人人精品| 日韩中文在线中文网三级| 中文字幕日韩专区| 欧美国产大片| 国产偷窥洗澡视频| 欧美午夜性生活| 久久人人97超碰精品888| 亚洲最大的av网站| 7777精品伊人久久久大香线蕉超级流畅| 欧美乱人伦中文字幕在线| 欧美天堂一区二区三区| 日日干日日操| 成人毛片在线精品国产| 国产无遮挡裸体免费久久| 女仆av观看一区| 黄色大片网站在线观看| 国产99在线| 波多野结衣av在线观看| 中文字幕在线不卡视频| 日本在线一区二区三区| 99精品欧美一区二区三区小说| 黄色在线视频网址| 日日骚一区二区三区| 亚洲av综合一区二区| 亚洲综合在线小说| 免费av毛片在线看| 中文字幕精品一区二区精品绿巨人| 一级特黄视频| 亚洲av永久纯肉无码精品动漫| 永久免费看片直接| 欧美高清69hd| 人妻精品无码一区二区三区| 亚洲精品国产品国语在线app| 成人免费大片黄在线播放| 久久久久久国产精品日本| 激情五月激情综合网| 99国产精品久久久久老师| 激情av一区二区| www.99久久热国产日韩欧美.com| 欧美激情电影| 亚洲国产专区| 无罩大乳的熟妇正在播放| 擼擼色在线看观看免费| 欧美国产激情二区三区| 精品国产九九九| 亚洲国产欧美在线观看| 一二三区精品福利视频| 美女不穿衣服的网站| 欧美动漫一区二区| 天堂网在线.www天堂在线视频| 俄罗斯黄色录像| 老司机凹凸av亚洲导航| 日韩精品一区二区三区外面| 黄色大片在线播放| 欧美 日韩 国产 成人 在线 91| 色婷婷综合久久久久中文一区二区| 欧美中文字幕亚洲一区二区va在线| www.com在线观看| 最新中文字幕免费视频| 在线综合视频| 男人操女人下面视频| 色欲久久久天天天综合网| 久久久另类综合| 666av成人影院在线观看| 欧美日韩国产成人高清视频| 91亚洲人成网污www| 国产精品yjizz视频网一二区| 在线男人天堂| 正在播放国产精品| 国产精品一区二区三区四区五区| 国产欧美日本在线| 欧美贵妇videos办公室| 色婷婷在线观看视频| 欧美一级欧美三级在线| 日本在线一区二区| 男人av资源站| 成r视频免费观看在线播放| 成人18视频日本| jizzjizz欧美69巨大| 国产91丝袜在线播放| 久久字幕精品一区| 亚洲宅男天堂在线观看无病毒| 99久久精品免费| 亚洲丰满在线| 波多野结衣网页| 国产欧美精品国产国产专区| 99综合电影在线视频| 97人洗澡人人免费公开视频碰碰碰| 欧洲美女精品免费观看视频| 亚洲经典一区二区| 黄色大片在线| 国产精品久久久久永久免费观看| 免费看涩涩视频软件| 免费精品在线视频| 日本高清不卡免费| 国产精品久久久久久久久久小说| 欧美午夜www高清视频| 国产一区二区黄色| 久久久91麻豆精品国产一区| 色老板在线观看| 手机看片福利永久国产日韩| 日韩理论片中文av| 福利欧美精品在线| 麻豆视频免费网站| 亚洲精品无码专区在线播放| 成人免费在线视频网| 91av免费观看91av精品在线| 亚欧无线一线二线三线区别| 手机电影在线观看| 97在线观看免费观看| 欧美韩日国产| 国产精品成熟老女人| 高清视频欧美一级| 在线播放免费av| 欧美风狂大伦交xxxx| 玛丽玛丽电影原版免费观看1977| 国产又粗又黄又猛| 亚洲最大成人免费视频| 蜜桃视频在线观看免费视频| 精品成人av一区二区在线播放| 国产中文精品久高清在线不| 激情综合网五月天| 欧美视频在线一区二区三区| 一区二区三区美女视频| 97精品中文字幕| 国产精品高潮呻吟| 成人综合婷婷国产精品久久蜜臀| 人人爽人人爽人人片av| 欧美性色19p| 欧美一级做a爰片免费视频| 欧美日韩亚洲不卡| 国产精品视频一区二区三区四区五区| 亚洲人成毛片在线播放女女| 精品一区二区在线免费观看| 日韩欧美中文在线视频| 免费大片在线观看| 国产情侣自拍av| 免费不卡av在线| 亚洲欧美日韩中文播放| 欧洲激情一区二区| 欧美另类videos黑人极品| 亚洲啪啪av| 欧美丰满少妇xxxx| 欧美激情综合五月色丁香| 国产精品综合av一区二区国产馆| 亚洲精品国产精品自产a区红杏吧| 国产精品一区二区在线看| 青青草原综合久久大伊人精品优势| 日本成年免费网站| 国产成人极品视频| 久久99性xxx老妇胖精品| 特种兵之深入敌后| 欧美人善交videosg| 成人观看免费完整观看| 久久久久久久一| 操人视频在线播放| 国产精品久久久av| 色综合久久88色综合天天| 欧美亚洲高清一区二区三区不卡| 一区三区二区视频| 欧美成人在线免费观看| 亚洲欧洲视频| 天天射天天干天天| 国产精品一区视频网站| 欧美精品色一区二区三区| 日韩免费av网站| 亚洲性视频h| 久久亚洲一区二区三区明星换脸| 亚洲精品国产精品国自产观看浪潮| 国产中文一区| 亚洲成人免费电影| 18岁以下禁止观看的美女视频| 99香蕉国产精品偷在线观看| 在线免费视频一区| 精品乱码亚洲一区二区不卡| 99热这里只有精品66| 亚洲欧美校园春色| 亚洲欧美激情网| 欧美日韩国产在线观看网站| 中文字幕av网址| 国产精品久久久久9999赢消| 国产成人午夜高潮毛片| 欧美成人综合网站| 91精品国产综合久久久久久| 成人av电影免费观看| 女人色在线免费视频| 国产男男gay体育生白袜| 亚洲福利一区二区三区| 一级片视频免费看| 国内精品久久久久久中文字幕| 国产一区二区三区四区五区| 亚洲日本视频| 欧美日韩a区| 亚洲黄色av| 青青草国产精品97视觉盛宴| 又色又爽又黄18网站| 亚洲精品一卡二卡| 亚洲成在人线在线播放| 久久久久久久性潮| 欧美一区二区视频17c| 国产suv精品一区| 91在线一区| 肉色丝袜一区二区| 一区二区高清免费观看影视大全| 亚洲美女色禁图| 国产精品密蕾丝袜| 欧美手机在线视频| 亚洲日本中文字幕免费在线不卡| 欧美午夜性春猛xxxx| 亚洲精品国产九九九| 欧美精三区欧美精三区| 人人澡人人爽| 亚洲精品中文字幕乱码三区| 亚洲精品一区二区三区在线观看| 欧美国产精品人人做人人爱| 成人精品视频一区二区| 久久久久久久久黄色| 免费看av的网址| heyzo高清国产精品| 欧美一区二区三区久久综| 9191在线视频| 欧美三级日韩三级国产三级| 精品一区二区国语对白| 性欧美16一18| 免费在线观看成人av| 久久久久国产美女免费网站| 国产精品18久久久久久久久久久久| 日韩免费观看一区二区| 2019最新中文字幕| 久久精品亚洲精品国产欧美kt∨| 无码人妻精品一区二区三区蜜桃91| 日韩一级免费一区| 成人羞羞视频在线看网址| 亚洲成人在线电影| 久久久久久免费毛片精品| 国产1区2区3区4区| 国产高潮又爽又无遮挡又免费| 亚洲欧美一区二区三区在线播放| 精品国产乱码久久久久久久| 欧美14一18处毛片| 久久久99久久精品女同性| 欧美一级片免费在线观看| 中文字幕 日韩有码| 久久精品国产99| 国产老头和老头xxxx×| 欧美成人手机在线视频| 97超碰在线视| 国产成人一区二区三区影院| 免费麻豆国产一区二区三区四区| 日本久久精品电影| 激情五月俺来也| 精品日本美女福利在线观看| 日韩欧美一区二区在线观看| 欧美亚洲国产怡红院影院| 都市激情久久| 日本午夜一区二区| 在线观看黄色网| 色哟哟精品一区| 天天综合网入口| 免费电影一区二区三区| 色综合视频在线| 亚洲精品久久久久中文字幕欢迎你| 国产男女在线观看| 天堂а√在线最新版中文在线| 久久综合一区二区| 欧美成人精品一区二区三区| 久久人人爽人人爽人人av| 肉色丝袜一区二区| 亚洲国产综合久久精品小蝴蝶| 91在线你懂的| 搡女人真爽免费午夜网站| 亚洲在线视频网站| 国产精品视频| 成人国产精品av| 91中文字精品一区二区| 国产美女精品视频免费播放软件| 日韩在线观看成人| 成人午夜视频免费在线观看| 国产精品羞羞答答xxdd| 天天av天天操| 免费高清在线观看| 国产电影一区二区三区| 国产一区二区三区免费不卡| 国产永久免费视频| 日韩专区视频| 亚洲美女av在线| 欧美aaaaaaaa牛牛影院| 欧美激情第6页| 中文幕一区二区三区久久蜜桃| 伊人久久成人网| 国产一级免费观看| 妞干网在线视频| 丝袜免费视频| 丰满熟女一区二区三区| 不卡一二三区首页| 成人免费看片网站| 久99久视频| 亚洲va久久久噜噜噜久久狠狠| 日本一区午夜艳熟免费| 国产精品久久久免费观看| 日韩成人毛片视频| 国产中文字幕视频在线观看| 中文字幕在线观看免费视频| 久久久影院官网| 久久免费在线观看视频| 国产va免费精品观看精品| 丰满少妇被猛烈进入一区二区| 十大免费污污软件| 亚洲日本在线观看视频|