我們使用 https://github.com/Go-SQL-Driver/MySQL 作為Go串連MySQL的驅動,進行資料庫操作練習。
(1)匯入資料庫驅動
import ( _"github.com/Go-SQL-Driver/MySQL")
這裡使用 _ 的意思是引入後面的包名而不直接使用這個包中定義的函數,變數等資源。若出現無法匯入的情況,我們可以使用以下方式解決(以 window系統為例)
windows+R 開啟cmd,輸入go get github.com/vmihailenco/redis ,斷行符號之後會自動下載項目到GOPATH中的src目錄下,然後重新整理IDE。
(2)資料庫連接
使用 sql.Open 用來開啟一個註冊過的資料庫驅動,這裡有幾種串連方式,如下所示,一般我們選用第二種方式
user@unix(/path/to/socket)/dbname?charset=utf8user:password@tcp(localhost:3306)/dbname?charset=utf8user:password@/dbnameuser:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname
(3)增刪改查操作
package mainimport ( "database/sql" "fmt" _"github.com/Go-SQL-Driver/MySQL")var( DBHostsIp = "localhost:3306" DBUserName = "root" DBPassWord = "123456" DBName = "localmysql")func main(){ //串連至資料庫 db,err := sql.Open("mysql", DBUserName+":"+DBPassWord+"@tcp("+DBHostsIp+")/"+DBName) CheckErr(err) insert(db) //關閉資料庫連接 db.Close()}//插入demofunc insert(db *sql.DB) { //準備插入操作 stmt,err := db.Prepare("INSERT user (user_name,user_age,user_sex) values (?,?,?)") CheckErr(err) //執行插入操作 res,err := stmt.Exec("limao",26,2) CheckErr(err) //返回最近的自增主鍵id id,err := res.LastInsertId() fmt.Println("LastInsertId: ",id)}//查詢demofunc query(db *sql.DB) { //rows:返回查詢操作的結果集 rows,err := db.Query("SELECT * FROM user") CheckErr(err) //第一步:接收在資料庫表查詢到的欄位名,返回的是一個string數組切片 columns, _ := rows.Columns() // columns: [user_id user_name user_age user_sex] //根據string數組切片的長度構造scanArgs、values兩個數組,scanArgs的每個值指向values相應值的地址 scanArgs := make([]interface{}, len(columns)) values := make([]interface{}, len(columns)) for i := range values { scanArgs[i] = &values[i] } for rows.Next() { //將查詢到的欄位名的地址複製到scanArgs數組中 err = rows.Scan(scanArgs...) CheckErr(err) //將行資料儲存到record字典 record := make(map[string]string) for i, col := range values { if col != nil { //欄位名 = 欄位資訊 record[columns[i]] = string(col.([]byte)) } } fmt.Println(record) }}//更新demofunc update(db *sql.DB) { //準備更新操作 stmt1,err := db.Prepare("UPDATE user SET user_age=?,user_sex=? WHERE user_id=?") CheckErr(err) //執行更新操作 res1, err := stmt1.Exec(21, 2, 1) CheckErr(err) //查詢更新多少條資訊 num, err := res1.RowsAffected() CheckErr(err) fmt.Println(num)}//刪除demofunc remove(db *sql.DB) { //準備刪除操作 stmt, err := db.Prepare(`DELETE FROM user WHERE user_id=?`) CheckErr(err) //執行刪除操作 res, err := stmt.Exec(1) CheckErr(err) //查詢刪除多少條資訊 num, err := res.RowsAffected() CheckErr(err) fmt.Println(num)}//檢查錯誤資訊func CheckErr(err error) { if err != nil { panic(err) }}
總結:
db.Prepare()函數用來返回準備要執行的sql操作,然後返回準備完畢的執行狀態。
db.Query()函數用來直接執行Sql返回Rows結果。
stmt.Exec()函數用來執行stmt準備好的SQL語句。
我們可以看到我們傳入的參數都是=?對應的資料,這樣做的方式可以一定程度上防止SQL注入。
參考文章:http://www.01happy.com/golang-mysql-demo/