一蒋院、準備
1桃焕、MySQL :數(shù)據(jù)庫服務端
2剑肯、MySQL Workbench:圖形界面,用于連接數(shù)據(jù)庫观堂,對數(shù)據(jù)庫進行操作
3退子、連接數(shù)據(jù)庫并創(chuàng)建表
二、引入driver
import(
"database/sql"
_"github.com/go-sql-driver/mysql"http:// "_" 引入后面的包名 而不直接使用里面的定義的函數(shù)型将、變量寂祥、資源等
)
三、連接數(shù)據(jù)庫
db,err := sql.Open("mysql","用戶名:密碼@tcp(127.0.0.1:3306)/demo?charset=utf8")
Tool.Check("打開數(shù)據(jù)庫",err)
//執(zhí)行Open函數(shù)的時候七兜,并不會去獲得數(shù)據(jù)庫連接有效性丸凭,當執(zhí)行數(shù)據(jù)庫操作的時候才會去連接,
// 當我們需要在Open之后就知道連接的有效性的時候腕铸,可以通過Ping()來進行
err = db.Ping()
Tool.Check("連接的有效性",err)
四惜犀、插入數(shù)據(jù)
res,err := db.Exec("INSERT INTO test(name1,age) VALUES('程咬金',9000)")
Tool.Check("插入數(shù)據(jù)",err)
id,err := res.LastInsertId()
Tool.Check("插入的id",err)
log.Println(id)
五、更新數(shù)據(jù)
res,err := db.Exec("UPDATE test SET age = ? WHERE name1 = ?",1000000,"程咬金")
Tool.Check("更新數(shù)據(jù)",err)
id,err := res.LastInsertId()
Tool.Check("更新的id",err)
log.Println(id)
六狠裹、刪除數(shù)據(jù)
res,err := db.Exec("DELETE? FROM test WHERE? name1 = ?","程咬金")
Tool.Check("刪除數(shù)據(jù)",err)
id,err := res.LastInsertId()
Tool.Check("刪除數(shù)據(jù)的id",err)
log.Println(id)
七虽界、預備表達式
//預備表達式 用來優(yōu)化SQL查詢 提高性能 減少SQL注入的風險
stmt,err := db.Prepare("UPDATE test SET age = ? WHERE name1 = 1 OR 1=1;")
Tool.Check("獲取行",err)
_,err = stmt.Exec("90909090","達摩")
Tool.Check("更新數(shù)據(jù)",err)
八、關閉數(shù)據(jù)庫
defer db.Close()
九涛菠、遇到的錯誤
1.ERROR 1366: 1366: Incorrect string value: '\xE6\x98\xAF\xE7\x9A\x84' for column 'name' at row 1
SQL Statement:
原因是: 創(chuàng)建數(shù)據(jù)庫的時候數(shù)據(jù)編碼設置錯誤