Go語言 Web開發(fā)(6)使用GO連接MySQL數(shù)據(jù)庫操作


我們使用 https://github.com/Go-SQL-Driver/MySQL 作為Go連接MySQL的驅(qū)動(dòng)朵耕,進(jìn)行數(shù)據(jù)庫操作練習(xí)低飒。

(1)導(dǎo)入數(shù)據(jù)庫驅(qū)動(dòng)

import (
   _"github.com/Go-SQL-Driver/MySQL"
)

這里使用 _ 的意思是引入后面的包名而不直接使用這個(gè)包中定義的函數(shù)围橡,變量等資源底燎。若出現(xiàn)無法導(dǎo)入的情況,我們可以使用以下方式解決(以 window系統(tǒng)為例)

windows+R 打開cmd衰猛,
輸入go get github.com/vmihailenco/redis ,
回車之后會(huì)自動(dòng)下載項(xiàng)目到GOPATH中的src目錄下,然后刷新IDE刹孔。

(2)數(shù)據(jù)庫連接
使用 sql.Open 用來打開一個(gè)注冊(cè)過的數(shù)據(jù)庫驅(qū)動(dòng)啡省,這里有幾種連接方式,如下所示髓霞,一般我們選用第二種方式

user@unix(/path/to/socket)/dbname?charset=utf8
user:password@tcp(localhost:3306)/dbname?charset=utf8
user:password@/dbname
user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname

(3)增刪改查操作

package main

import (
   "database/sql"
   "fmt"
   _"github.com/Go-SQL-Driver/MySQL"
)

const(
   DBHostsIp  = "localhost:3306"
   DBUserName = "root"
   DBPassWord = "123456"
   DBName     = "localmysql"
)

func main(){
   //連接至數(shù)據(jù)庫
   db,err := sql.Open("mysql", DBUserName+":"+DBPassWord+"@tcp("+DBHostsIp+")/"+DBName)
   CheckErr(err)
   insert(db)
   //關(guān)閉數(shù)據(jù)庫連接
   db.Close()
}
//插入demo
func insert(db *sql.DB)  {
   //準(zhǔn)備插入操作
   stmt,err := db.Prepare("INSERT user (user_name,user_age,user_sex) values (?,?,?)")
   CheckErr(err)
   //執(zhí)行插入操作
   res,err := stmt.Exec("limao",26,2)
   CheckErr(err)
   //返回最近的自增主鍵id
   id,err := res.LastInsertId()
   fmt.Println("LastInsertId: ",id)
}
//查詢demo
func query(db *sql.DB)  {
   //rows:返回查詢操作的結(jié)果集
   rows,err := db.Query("SELECT * FROM user")
   CheckErr(err)
   //第一步:接收在數(shù)據(jù)庫表查詢到的字段名卦睹,返回的是一個(gè)string數(shù)組切片
   columns, _ := rows.Columns() // columns:  [user_id user_name user_age user_sex]
   //根據(jù)string數(shù)組切片的長度構(gòu)造scanArgs、values兩個(gè)數(shù)組方库,scanArgs的每個(gè)值指向values相應(yīng)值的地址
   scanArgs := make([]interface{}, len(columns))
   values := make([]interface{}, len(columns))
   for i := range values {
      scanArgs[i] = &values[i]
   }
   for rows.Next() {
      //將查詢到的字段名的地址復(fù)制到scanArgs數(shù)組中
      err = rows.Scan(scanArgs...)
      CheckErr(err)
      //將行數(shù)據(jù)保存到record字典
      record := make(map[string]string)
      for i, col := range values {
         if col != nil {
            //字段名 = 字段信息
            record[columns[i]] = string(col.([]byte))
         }
      }
      fmt.Println(record)
   }
}
//更新demo
func update(db *sql.DB)  {
   //準(zhǔn)備更新操作
   stmt1,err := db.Prepare("UPDATE user SET user_age=?,user_sex=? WHERE user_id=?")
   CheckErr(err)
   //執(zhí)行更新操作
   res1, err := stmt1.Exec(21, 2, 1)
   CheckErr(err)
   //查詢更新多少條信息
   num, err := res1.RowsAffected()
   CheckErr(err)
   fmt.Println(num)
}
//刪除demo
func remove(db *sql.DB)  {
   //準(zhǔn)備刪除操作
   stmt, err := db.Prepare(`DELETE FROM user WHERE user_id=?`)
   CheckErr(err)
   //執(zhí)行刪除操作
   res, err := stmt.Exec(1)
   CheckErr(err)
   //查詢刪除多少條信息
   num, err := res.RowsAffected()
   CheckErr(err)
   fmt.Println(num)
}

//檢查錯(cuò)誤信息
func CheckErr(err error)  {
   if err != nil {
      panic(err)
   }
}

總結(jié):
db.Prepare()函數(shù)用來返回準(zhǔn)備要執(zhí)行的sql操作结序,然后返回準(zhǔn)備完畢的執(zhí)行狀態(tài)。
db.Query()函數(shù)用來直接執(zhí)行Sql返回Rows結(jié)果纵潦。
stmt.Exec()函數(shù)用來執(zhí)行stmt準(zhǔn)備好的SQL語句徐鹤。
我們可以看到我們傳入的參數(shù)都是=?對(duì)應(yīng)的數(shù)據(jù),這樣做的方式可以一定程度上防止SQL注入邀层。

參考文章:http://www.01happy.com/golang-mysql-demo/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末返敬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子被济,更是在濱河造成了極大的恐慌救赐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件只磷,死亡現(xiàn)場(chǎng)離奇詭異经磅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钮追,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門预厌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人元媚,你說我怎么就攤上這事轧叽∶绮祝” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵炭晒,是天一觀的道長待逞。 經(jīng)常有香客問我,道長网严,這世上最難降的妖魔是什么识樱? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮震束,結(jié)果婚禮上怜庸,老公的妹妹穿的比我還像新娘。我一直安慰自己垢村,他們只是感情好割疾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嘉栓,像睡著了一般宏榕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胸懈,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天担扑,我揣著相機(jī)與錄音恰响,去河邊找鬼趣钱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胚宦,可吹牛的內(nèi)容都是我干的首有。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼枢劝,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼井联!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起您旁,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤烙常,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鹤盒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚕脏,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年侦锯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驼鞭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尺碰,死狀恐怖挣棕,靈堂內(nèi)的尸體忽然破棺而出译隘,到底是詐尸還是另有隱情,我是刑警寧澤洛心,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布固耘,位于F島的核電站,受9級(jí)特大地震影響词身,放射性物質(zhì)發(fā)生泄漏玻驻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一偿枕、第九天 我趴在偏房一處隱蔽的房頂上張望璧瞬。 院中可真熱鬧,春花似錦渐夸、人聲如沸嗤锉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘟忱。三九已至,卻和暖如春苫幢,著一層夾襖步出監(jiān)牢的瞬間访诱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工韩肝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留触菜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓哀峻,卻偏偏與公主長得像涡相,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剩蟀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,936評(píng)論 2 89
  • 轉(zhuǎn) # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    呂品?閱讀 9,728評(píng)論 0 44
  • 昨天育特,一個(gè)人去電影院看了《七十七天》丙号,我等這部電影上映等了兩年,果然沒有讓我失望缰冤。 電影給我最大的體會(huì)是:勇氣犬缨、孤...
    一言二丫閱讀 406評(píng)論 2 2
  • 市場(chǎng)不會(huì)因?yàn)槟憬?jīng)商資歷淺而格外開恩, 員工不會(huì)因?yàn)槟阒v義氣而不要金錢回報(bào)锋谐, 競(jìng)爭(zhēng)對(duì)手不會(huì)因?yàn)槟惴稿e(cuò)了而不超越你遍尺, ...
    張升勝閱讀 305評(píng)論 0 0
  • 準(zhǔn)備工作: 1.查看 ipad版本是否適合本教程 2.查看 iPad 內(nèi)存是否足夠 3.越獄有風(fēng)險(xiǎn)注意將自己重要的...
    忘山老人閱讀 5,442評(píng)論 0 0