目錄
- 一、Mysql數據庫
- 二、Golang操作Mysql
- 1. 現有test數據庫表格user
- 2. 連接mysql數據庫
- 3. SELECT數據庫查詢操作
- 4. Insert數據庫插入操作
- 5. Update數據庫更新操作
- 6. DELETE數據庫刪除操作
- 三、生成動態字段數據庫查詢結果
一、Mysql數據庫
為什么要使用數據庫
- 一開始人手動記錄數據,不能長期保存,追溯;
- 然后創建了文件系統,能夠長期保存,但是查詢追溯更新麻煩,數據可以發生冗余重復;
- 實現了數據庫的方式,能夠長期保存,方便查詢,追溯,更新等等一系列操作,能設置一些約束進行數據的自我管控等等。
簡單介紹下Mysql數據庫的特點:關系型數據庫、體積小、速度快、成本低、開源代碼、中小網站適用、非常適合初學者學習
二、Golang操作Mysql
1. 現有test數據庫表格user

2. 連接mysql數據庫
2.1. 使用到的第三方庫
github.com/go-sql-driver/mysql(驅動)
github.com/jmoiron/sqlx(對驅動的操作封裝)
2.2. 連接
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
func main() {
db, err := sqlx.Open("mysql", "username:password@(127.0.0.1:3306)/test?charset=utf8mb4")
if err != nil {
fmt.Println("open mysql failed,", err)
}
db.SetMaxIdleConns(5) //設置最大的空閑數
db.SetMaxOpenConns(15) //設置最大的連接數
}
//db, err := sqlx.Open("數據庫類型", "用戶名:密碼@tcp(地址:端口)/數據庫名")
3. SELECT數據庫查詢操作
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
var db *sqlx.DB
func initDB() {
var err error
db, err = sqlx.Open("mysql", "username:password@(127.0.0.1:3306)/test?charset=utf8mb4parseTime=trueloc=Local")
if err != nil {
fmt.Println("open mysql failed,", err)
}
db.SetMaxIdleConns(5)
db.SetMaxOpenConns(15)
}
type User struct {
Id int64 `db:"id"`
Name string `db:"name"`
Age int64 `db:"age"`
Sex string `db:"sex"`
}
func main() {
initDB()
defer db.Close()
var user []User
sqlStr := "SELECT * FROM user"
err := db.Select(user, sqlStr)
if err != nil {
fmt.Println(err)
}
fmt.Println(user)
}
得到結果->
[{1 張三 20 男} {2 李四 21 女} {3 王五 25 男}]
4. Insert數據庫插入操作
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
var db *sqlx.DB
func initDB() {
var err error
db, err = sqlx.Open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
if err != nil {
fmt.Println("open mysql failed,", err)
}
db.SetMaxIdleConns(5)
db.SetMaxOpenConns(15)
}
type User struct {
Id int64 `db:"id"`
Name string `db:"name"`
Age int64 `db:"age"`
Sex string `db:"sex"`
}
func main() {
initDB()
defer db.Close()
var user = User{
Name: "小六",
Age: 18,
Sex: "女",
}
sqlStr := "INSERT INTO user(name, age, sex) VALUES (?,?,?)"
res, err := db.Exec(sqlStr, user.Name, user.Age, user.Sex)
if err != nil {
fmt.Println(err)
}
c, _ := res.RowsAffected()
fmt.Println("有多少行被創建", c)
}
得到結果->
有多少行被創建 1

5. Update數據庫更新操作
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
var db *sqlx.DB
func initDB() {
var err error
db, err = sqlx.Open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
if err != nil {
fmt.Println("open mysql failed,", err)
}
db.SetMaxIdleConns(5)
db.SetMaxOpenConns(15)
}
type User struct {
Id int64 `db:"id"`
Name string `db:"name"`
Age int64 `db:"age"`
Sex string `db:"sex"`
}
func main() {
initDB()
defer db.Close()
var user = User{
Id: 4,
Age: 20,
}
sqlStr := "UPDATE user SET age=? WHERE id=?"
res, err := db.Exec(sqlStr, user.Age, user.Id)
if err != nil {
fmt.Println(err)
}
c, _ := res.RowsAffected()
fmt.Println("有多少行被更改", c)
}
得到結果->
有多少行被更改 1

6. DELETE數據庫刪除操作
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
var db *sqlx.DB
func initDB() {
var err error
db, err = sqlx.Open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
if err != nil {
fmt.Println("open mysql failed,", err)
}
db.SetMaxIdleConns(5)
db.SetMaxOpenConns(15)
}
type User struct {
Id int64 `db:"id"`
Name string `db:"name"`
Age int64 `db:"age"`
Sex string `db:"sex"`
}
func main() {
initDB()
defer db.Close()
deleteId := 3
sqlStr := "DELETE FROM user WHERE id=?"
res, err := db.Exec(sqlStr, deleteId)
if err != nil {
fmt.Println(err)
}
c, _ := res.RowsAffected()
fmt.Println("有多少行被刪除", c)
}
得到結果->
有多少行被刪除 1

三、生成動態字段數據庫查詢結果
在項目中經常會遇到一個問題:在同一個函數中,查詢不同的表格,生成不同的結果,每次都要重新構建結構體
思路:把結果弄成[]map[string]string類型,這樣就能把查詢得到的數據都填充進去。
使用的是內置的庫
database/sql
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
func initDB() {
var err error
db, err = sql.Open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
if err != nil {
fmt.Println("open mysql failed,", err)
}
db.SetMaxIdleConns(5)
db.SetMaxOpenConns(15)
}
func main() {
initDB()
defer db.Close()
sqlStr := "SELECT * FROM user" //可以換成其它的查詢語句,可以得到相應的查詢結果,不用每次都去構建存放的結構體
rows, err := db.Query(sqlStr)
if err != nil {
fmt.Println(err)
}
defer rows.Close()
//列出所有查詢結果的字段名
cols, _ := rows.Columns()
//values是每個列的值,這里獲取到byte里
values := make([][]byte, len(cols))
//query.Scan的參數,因為每次查詢出來的列是不定長的,用len(cols)定住當次查詢的長度
scans := make([]interface{}, len(cols))
//讓每一行數據都填充到[][]byte里面
for i := range values {
scans[i] = values[i]
}
res := make([]map[string]string, 0)
for rows.Next() {
_ = rows.Scan(scans...)
row := make(map[string]string)
for k, v := range values { //每行數據是放在values里面,現在把它挪到row里
key := cols[k]
row[key] = string(v)
}
res = append(res, row)
}
fmt.Println(res)
}
得到結果->
[map[age:20 id:1 name:張三 sex:男] map[age:21 id:2 name:李四 sex:女] map[age:20 id:4 name:小六 sex:女]]
到此這篇關于Golang 數據庫操作(sqlx)和不定字段結果查詢的文章就介紹到這了,更多相關Golang 數據庫操作和不定字段結果查詢內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Golang操作MySql數據庫的完整步驟記錄
- 利用golang驅動操作MongoDB數據庫的步驟
- golang常用庫之操作數據庫的orm框架-gorm基本使用詳解
- 在golang中操作mysql數據庫的實現代碼
- Golang對MongoDB數據庫的操作簡單封裝教程
- golang實現mysql數據庫備份的操作方法