[TOC]
## 1\. 下載依賴
~~~
go get -u github.com/go-sql-driver/mysql
~~~
## 2\. 使用Mysql驅動
~~~
func Open(driverName, dataSourceName string) (*DB, error)
~~~
Open方法打開一個指定的數據庫
driverName為驅動名稱,例mysql
dataSourceName為數據庫連接信息
返回DB 和 error
demo1
~~~
func main() {
// dsn: Data Source Name
// 用戶名為root,密碼為123456,數據庫為test
dsn := "root:123456@tcp(127.0.0.1:3306)/test"
? ?
? ?// Open()方法對dsn的一個格式校驗,并沒有實際連接到數據庫
db, err := sql.Open("mysql", dsn)
if err != nil {
panic(err)
}
defer db.Close()
}
~~~
### **Mysql Demo:**
~~~
// 定義一個全局變量
var db *sql.DB
?
// 定義初始化mysql的方法
func initMysql() (err error) {
// dsn: Data Source Name
// 用戶名為root,密碼為123456,數據庫為test
dsn := "root:123456@tcp(127.0.0.1:3306)/test"
?
// Open()方法對dsn的一個格式校驗,并沒有實際連接到數據庫
db, err = sql.Open("mysql", dsn)
if err != nil {
panic(err)
}
?
// 與數據庫建立連接
err = db.Ping()
if err != nil {
fmt.Printf("connect to db failed, err:%v\n", err)
return
}
return
}
?
func main() {
if err := initMysql(); err != nil {
panic(err)
}
defer db.Close()
fmt.Println("connected to db...")
}
~~~
## 3\. 單行查詢
單行查詢`db.QueryRow()`執行一次查詢,并期望返回最多一行結果(即Row)。QueryRow總是返回非nil的值,直到返回值的Scan方法被調用時,才會返回被延遲的錯誤。
~~~
func (db *DB) QueryRow(query string, args ...interface{}) *Row
~~~
代碼示例:
~~~
// 單行查詢
func queryRowDemo() {
// sql語句
sqlStr := "select id, name, age from user where id=?"
var u user
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)
}
~~~
## 4\. 多行查詢
多行查詢`db.Query()`執行一次查詢,返回多行結果(即Rows),一般用于執行select命令。參數args表示query中的占位參數。
~~~
func (db *DB) Query(query string, args ...interface{}) (*Rows, error)
~~~
代碼示例:
~~~
// 多行查詢
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
}
// 關閉rows釋放持有的數據庫鏈接
defer rows.Close()
?
// 循環讀取結果集中的數據
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)
}
}
~~~
## 5\. 插入數據
插入、更新和刪除操作都使用`Exec`方法。
~~~
func (db *DB) Exec(query string, args ...interface{}) (Result, error)
~~~
Exec執行一次命令(包括查詢、刪除、更新、插入等),返回的Result是對已執行的SQL命令的總結。參數args表示query中的占位參數。
代碼示例:
~~~
// 插入數據
func insertRowDemo(name string, age int) {
sqlStr := "insert into user(name, age) values (?,?)"
result, err := db.Exec(sqlStr, name, age)
if err != nil {
fmt.Printf("insert failed, err:%v\n", err)
return
}
// RowsAffected()方法,表示影響的行數
// num, err := result.RowsAffected()
lastId, err := result.LastInsertId() // 新插入數據的id
if err != nil {
fmt.Printf("get lastinsert ID failed, err:%v\n", err)
return
}
fmt.Printf("insert successfully, the id is %d.\n", lastId)
}
~~~
## 6\. 更新數據
~~~
// 更新數據
func updateRowDemo() {
sqlStr := "update user set age=? where id = ?"
result, err := db.Exec(sqlStr, 23, 1)
if err != nil {
fmt.Printf("update data failed, err:%v\n", err)
return
}
// 操作影響的行數
num, err := result.RowsAffected()
if err != nil {
fmt.Printf("get RowsAffected failed, err:%v\n", err)
return
}
?
fmt.Printf("update data successfully, %d rows affected\n", num)
}
~~~
## 7\. 刪除數據
~~~
// 刪除數據
func deleteRowDemo() {
sqlStr := "delete from user where id = ?"
result, err := db.Exec(sqlStr, 3)
if err != nil {
fmt.Printf("delete failed, err:%v\n", err)
return
}
num, err := result.RowsAffected() // 操作影響的行數
if err != nil {
fmt.Printf("get RowsAffected failed, err:%v\n", err)
return
}
fmt.Printf("delete success, affected rows:%d\n", num)
}
~~~
## 8\. Go實現Mysql預處理
為什么要預處理?
1. 優化MySQL服務器重復執行SQL的方法,可以提升服務器性能,提前讓服務器編譯,一次編譯多次執行,節省后續編譯的成本。
2. 避免SQL注入問題
`database/sql`中使用下面的`Prepare`方法來實現預處理操作。
~~~
func (db *DB) Prepare(query string) (*Stmt, error)
~~~
~~~
// 預處理
func prepareQueryDemo() {
sqlStr := "select id, name, age from user where id > ?"
stmt, err := db.Prepare(sqlStr)
if err != nil {
fmt.Printf("prepare failed, err:%v\n", err)
return
}
defer stmt.Close()
rows, err := stmt.Query(0)
if err != nil {
fmt.Printf("query failed, err:%v\n", err)
return
}
defer rows.Close()
// 循環讀取結果集中的數據
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)
}
}
~~~
## 9\. Go實現Mysql事務
Go語言中使用以下三個方法實現MySQL中的事務操作。
開始事務
~~~
func (db *DB) Begin() (*Tx, error)
~~~
提交事務
~~~
func (tx *Tx) Commit() error
~~~
回滾事務
~~~
func (tx *Tx) Rollback() error
~~~
示例代碼
~~~
// 事務操作
func transactionDemo() {
tx, err := db.Begin() // 開啟事務
if err != nil {
if tx != nil {
tx.Rollback() // 回滾
}
fmt.Printf("begin trans failed, err:%v\n", err)
return
}
sqlStr1 := "update user set age=30 where id=?"
result1, err := tx.Exec(sqlStr1, 1)
if err != nil {
tx.Rollback() // 回滾
fmt.Printf("exec sql failed, err:%v\n", err)
return
}
num1, err := result1.RowsAffected()
if err != nil {
tx.Rollback() // 回滾
fmt.Printf("exec result.RowsAffected failed, err:%v\n", err)
return
}
?
sqlStr2 := "update user set age=30 where id=?"
result2, err := tx.Exec(sqlStr2, 2)
if err != nil {
tx.Rollback() // 回滾
fmt.Printf("exec sql failed, err:%v\n", err)
return
}
num2, err := result2.RowsAffected()
if err != nil {
tx.Rollback() // 回滾
fmt.Printf("exec result.RowsAffected failed, err:%v\n", err)
return
}
?
fmt.Println(num1, num2)
if num1 == 1 && num2 == 1 {
fmt.Println("事務提交啦。。。")
tx.Commit()
} else {
tx.Rollback()
fmt.Println("事務回滾啦。。。")
}
fmt.Println("exec trans success!")
}
~~~
- Golang
- 基礎知識
- 基本數據類型
- 運算符
- 變量&常量
- 流程控制
- 數組
- 切片
- string操作
- Map及實現原理
- Go其他
- CLI命令
- Golang內置類型和函數
- init函數和main函數
- 網絡編程
- 互聯網協議
- socket編程
- 單元測試
- 并發編程
- channel
- 優雅地關閉channel
- Mutex
- GMP原理與調度
- Go Web
- HTTP Server
- gin框架
- 快速入門
- HTML渲染
- JSONP
- Multipart/Urlencoded綁定
- PureJSON
- gin路由
- beego框架
- Bee工具安裝
- 配置模塊
- Web模塊
- 路由
- 數據操作
- Go操作Mysql數據庫
- Go操作redis
- mongo-driver
- sqlx庫
- 操作etcd
- msgpack
- 網絡爬蟲
- 獲取頁面
- 標準庫
- IO操作
- 文件操作
- fmt
- 格式化輸出
- flag
- log
- time
- strconv
- template
- os
- sync.Mutex
- Context
- 第三方庫
- zap庫
- viper
- validator參數校驗
- GORM
- 基礎
- CRUD接口
- INI
- GoFrame
- 快速開始
- 微服務
- go-kit
- gRPC
- Protocol Buffers 語法指南
- go-zero
- 相關名詞解釋
- 數據結構和算法
- 基礎知識
- 鏈表
- Golang GUI
- fyne基礎
- 顯示時間
- RabbitMQ-Go
- centos7 安裝rabbitmq-server
- RabbitMQ介紹
- 工作隊列
- Go設計模式
- 設計模式的分類
- 簡單工廠模式
- golang自舉編譯
- 了解sync.Once
- 知識碎片
- 常見問題
- 開源項目
- Python
- Anaconda
- 介紹、使用教程
- Python基礎知識
- Python之禪
- 變量和類型
- 流程控制
- Python運維
- Python內置工具
- 命令行工具
- 包管理工具pip
- 小爬蟲筆記
- I/O操作
- requests庫
- requests基本使用
- BeautifulSoup庫
- BeautifulSoup基本使用
- Scrapy框架
- 數據可視化
- Django
- Django起步
- OpenCV
- OpenCV入門
- 前端
- HTML
- CSS
- CSS權重計算
- Javascript
- 基礎
- JS基礎知識
- 監聽事件
- 字符串操作
- 數組操作
- 輸入輸出
- 定時器
- 樣式操作
- 獲取url參數
- Typescript
- Pick 與 Omit TS內置類型
- Vue.js
- Vue.js介紹
- Vue.js基礎
- Vue指令
- v-model
- v-for
- 指令修飾符
- Q&A
- 命令
- Vue3
- node.js
- node.js基礎
- npm遇到的問題
- 相關工具安裝
- nvm使用教程
- 工程化webpack
- Linux
- Linux基礎
- 符號鏈接
- Shell
- 腳本執行方式
- 數據的輸入輸出
- 腳本執行中的問題
- tcpdump
- 正則表達式
- Elasticsearch
- Docker
- Docker的基礎概念與操作
- Docker 安裝
- 容器技術原理
- Docker核心概念
- Docker基本操作
- 鏡像相關操作
- 容器相關操作
- 鏡像加速器
- Dockerfile
- COPY復制文件
- Docker所遇問題
- ansible
- ansible入門
- k8s
- 安裝工具
- kubectl
- Git
- gitlab
- gitlab備份與恢復
- gitlab基本使用
- git使用
- git常用命令
- git提交問題
- git提交規范
- 數據庫
- MySQL
- MySQL介紹
- mariadb安裝
- 主主復制
- 數據庫問題集結
- 開啟binlog
- MySQL常用命令
- SQL總結
- MySQL性能優化系列
- 第一章 初始化安裝和簡單安全加固
- 第二章 認識performance_schema
- 第三章 MySQL體系結構
- MySQL配置模板
- Redis
- Redis簡單使用
- Redis常見問題
- Redis集群
- Redis Cluster概述
- 數據分布
- 搭建集群
- MongoDB
- mongodb分片
- MongoDB分片集群設置密碼驗證
- TiDB
- 單機模擬部署生產環境集群
- 服務器
- CentOS
- 配置阿里云的yum源和epel源
- centos7 實現NFS文件共享
- rsync
- centos7 源碼編譯rsync
- rsync實現文件同步
- 添加刪除swap分區
- 清除buff/cache
- 配置ntp時間同步
- centos7安裝pip
- centos7虛擬機啟動報xfs錯誤
- centos7常用命令
- centos7安裝mysql
- centos7安裝python3.x
- centos7升級gcc、g++
- centos7安裝nginx
- centos7部署Nexus
- centos7離線安裝python3
- centos7.6編譯mariadb10.5.22
- CentOS8
- 銀河麒麟V4
- nginx編譯
- 銀河麒麟V10_x86
- 安裝VNC
- 單用戶模式
- UOS
- 配置本地apt源
- apt安裝vnc-server
- UOS單用戶模式
- UOS創建自啟動腳本
- 源碼編譯
- oniguruma編譯
- Proxmox VE
- PVE基本使用
- PVE故障
- KVM
- KVM相關命令
- 銀河麒麟V10_x86安裝kvm
- UOS_arm64安裝kvm
- yum、rpm、apt
- dpkg、apt-get、yum和rpm的區別
- rpm打包
- yum相關問題
- 內建銀河麒麟的apt源
- 其他軟件
- JuiceFS
- nacos
- 常見命令
- 硬盤分區
- Linux常見問題
- 測試
- sysbench
- 其他
- Cloc代碼統計工具
- onlyoffice 在線文檔編輯
- onlyoffice添加中文字體
- 遇到的問題
- 網絡通信協議
- 部署相關記錄
- Vmware workstation虛擬機遷移到PVE指南
- 小操作