在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ GO/ 5.2 使用MySQL數(shù)據(jù)庫(kù)
7 文本處理
3 Web基礎(chǔ)
14 擴(kuò)展Web框架
10.4 小結(jié)
2.2 Go基礎(chǔ)
2.8 總結(jié)
6.1 session和cookie
5.5 使用beedb庫(kù)進(jìn)行ORM開發(fā)
8.3 REST
13.6 小結(jié)
5.4 使用PostgreSQL數(shù)據(jù)庫(kù)
14.6 pprof支持
14.1 靜態(tài)文件支持
11.2 使用GDB調(diào)試
7.7 小結(jié)
1 GO環(huán)境配置
14.5 多語言支持
7.1 XML處理
1.5 總結(jié)
13 如何設(shè)計(jì)一個(gè)Web框架
14.3 表單及驗(yàn)證支持
12 部署與維護(hù)
10 國(guó)際化和本地化
1.1 Go 安裝
6.2 Go如何使用session
5.6 NOSQL數(shù)據(jù)庫(kù)操作
6.5 小結(jié)
9.4 避免SQL注入
12.1 應(yīng)用日志
4.2 驗(yàn)證表單的輸入
10.1 設(shè)置默認(rèn)地區(qū)
1.3 Go 命令
9.6 加密和解密數(shù)據(jù)
4.1 處理表單的輸入
4.4 防止多次遞交表單
11.3 Go怎么寫測(cè)試用例
8 Web服務(wù)
12.3 應(yīng)用部署
5.7 小結(jié)
12.5 小結(jié)
11 錯(cuò)誤處理,調(diào)試和測(cè)試
9.2 確保輸入過濾
14.2 Session支持
6.4 預(yù)防session劫持
12.4 備份和恢復(fù)
8.1 Socket編程
13.1 項(xiàng)目規(guī)劃
13.4 日志和配置設(shè)計(jì)
7.6 字符串處理
13.2 自定義路由器設(shè)計(jì)
6.3 session存儲(chǔ)
3.4 Go的http包詳解
8.2 WebSocket
10.3 國(guó)際化站點(diǎn)
7.5 文件操作
7.4 模板處理
9.1 預(yù)防CSRF攻擊
13.3 controller設(shè)計(jì)
2.6 interface
14.4 用戶認(rèn)證
2.3 流程和函數(shù)
附錄A 參考資料
11.1 錯(cuò)誤處理
9.5 存儲(chǔ)密碼
9.3 避免XSS攻擊
12.2 網(wǎng)站錯(cuò)誤處理
6 session和數(shù)據(jù)存儲(chǔ)
2.4 struct類型
3.3 Go如何使得Web工作
2.5 面向?qū)ο?/span>
3.1 Web工作方式
1.2 GOPATH與工作空間
2.1 你好,Go
9.7 小結(jié)
13.5 實(shí)現(xiàn)博客的增刪改
7.2 JSON處理
10.2 本地化資源
7.3 正則處理
2 Go語言基礎(chǔ)
5.1 database/sql接口
4.5 處理文件上傳
8.5 小結(jié)
4.3 預(yù)防跨站腳本
5.3 使用SQLite數(shù)據(jù)庫(kù)
14.7 小結(jié)
3.2 Go搭建一個(gè)Web服務(wù)器
2.7 并發(fā)
5 訪問數(shù)據(jù)庫(kù)
4 表單
3.5 小結(jié)
1.4 Go開發(fā)工具
11.4 小結(jié)
9 安全與加密
5.2 使用MySQL數(shù)據(jù)庫(kù)
4.6 小結(jié)
8.4 RPC

5.2 使用MySQL數(shù)據(jù)庫(kù)

目前Internet上流行的網(wǎng)站構(gòu)架方式是LAMP,其中的M即MySQL, 作為數(shù)據(jù)庫(kù),MySQL以免費(fèi)、開源、使用方便為優(yōu)勢(shì)成為了很多Web開發(fā)的后端數(shù)據(jù)庫(kù)存儲(chǔ)引擎。

MySQL驅(qū)動(dòng)

Go中支持MySQL的驅(qū)動(dòng)目前比較多,有如下幾種,有些是支持database/sql標(biāo)準(zhǔn),而有些是采用了自己的實(shí)現(xiàn)接口,常用的有如下幾種:

接下來的例子我主要以第一個(gè)驅(qū)動(dòng)為例(我目前項(xiàng)目中也是采用它來驅(qū)動(dòng)),也推薦大家采用它,主要理由:

  • 這個(gè)驅(qū)動(dòng)比較新,維護(hù)的比較好
  • 完全支持database/sql接口
  • 支持keepalive,保持長(zhǎng)連接,雖然星星fork的mymysql也支持keepalive,但不是線程安全的,這個(gè)從底層就支持了keepalive。

示例代碼

接下來的幾個(gè)小節(jié)里面我們都將采用同一個(gè)數(shù)據(jù)庫(kù)表結(jié)構(gòu):數(shù)據(jù)庫(kù)test,用戶表userinfo,關(guān)聯(lián)用戶信息表userdetail。

CREATE TABLE `userinfo` (
    `uid` INT(10) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(64) NULL DEFAULT NULL,
    `departname` VARCHAR(64) NULL DEFAULT NULL,
    `created` DATE NULL DEFAULT NULL,
    PRIMARY KEY (`uid`)
)

CREATE TABLE `userdetail` (
    `uid` INT(10) NOT NULL DEFAULT '0',
    `intro` TEXT NULL,
    `profile` TEXT NULL,
    PRIMARY KEY (`uid`)
)

如下示例將示范如何使用database/sql接口對(duì)數(shù)據(jù)庫(kù)表進(jìn)行增刪改查操作

package main

import (
    _ "github.com/go-sql-driver/mysql"
    "database/sql"
    "fmt"
    //"time"
)

func main() {
    db, err := sql.Open("mysql", "astaxie:astaxie@/test?charset=utf8")
    checkErr(err)

    //插入數(shù)據(jù)
    stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
    checkErr(err)

    res, err := stmt.Exec("astaxie", "研發(fā)部門", "2012-12-09")
    checkErr(err)

    id, err := res.LastInsertId()
    checkErr(err)

    fmt.Println(id)
    //更新數(shù)據(jù)
    stmt, err = db.Prepare("update userinfo set username=? where uid=?")
    checkErr(err)

    res, err = stmt.Exec("astaxieupdate", id)
    checkErr(err)

    affect, err := res.RowsAffected()
    checkErr(err)

    fmt.Println(affect)

    //查詢數(shù)據(jù)
    rows, err := db.Query("SELECT * FROM userinfo")
    checkErr(err)

    for rows.Next() {
        var uid int
        var username string
        var department string
        var created string
        err = rows.Scan(&uid, &username, &department, &created)
        checkErr(err)
        fmt.Println(uid)
        fmt.Println(username)
        fmt.Println(department)
        fmt.Println(created)
    }

    //刪除數(shù)據(jù)
    stmt, err = db.Prepare("delete from userinfo where uid=?")
    checkErr(err)

    res, err = stmt.Exec(id)
    checkErr(err)

    affect, err = res.RowsAffected()
    checkErr(err)

    fmt.Println(affect)

    db.Close()

}

func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

通過上面的代碼我們可以看出,Go操作Mysql數(shù)據(jù)庫(kù)是很方便的。

關(guān)鍵的幾個(gè)函數(shù)我解釋一下:

sql.Open()函數(shù)用來打開一個(gè)注冊(cè)過的數(shù)據(jù)庫(kù)驅(qū)動(dòng),go-sql-driver中注冊(cè)了mysql這個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng),第二個(gè)參數(shù)是DSN(Data Source Name),它是go-sql-driver定義的一些數(shù)據(jù)庫(kù)鏈接和配置信息。它支持如下格式:

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

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注入。