Golang 數(shù)據(jù)庫(kù)操作(sqlx)和不定字段結(jié)果查詢
一、Mysql數(shù)據(jù)庫(kù)
為什么要使用數(shù)據(jù)庫(kù)
- 一開(kāi)始人手動(dòng)記錄數(shù)據(jù),不能長(zhǎng)期保存,追溯;
- 然后創(chuàng)建了文件系統(tǒng),能夠長(zhǎng)期保存,但是查詢追溯更新麻煩,數(shù)據(jù)可以發(fā)生冗余重復(fù);
- 實(shí)現(xiàn)了數(shù)據(jù)庫(kù)的方式,能夠長(zhǎng)期保存,方便查詢,追溯,更新等等一系列操作,能設(shè)置一些約束進(jìn)行數(shù)據(jù)的自我管控等等。
簡(jiǎn)單介紹下Mysql數(shù)據(jù)庫(kù)的特點(diǎn):關(guān)系型數(shù)據(jù)庫(kù)、體積小、速度快、成本低、開(kāi)源代碼、中小網(wǎng)站適用、非常適合初學(xué)者學(xué)習(xí)
二、Golang操作Mysql
1. 現(xiàn)有test數(shù)據(jù)庫(kù)表格user

2. 連接mysql數(shù)據(jù)庫(kù)
2.1. 使用到的第三方庫(kù)
github.com/go-sql-driver/mysql(驅(qū)動(dòng))
github.com/jmoiron/sqlx(對(duì)驅(qū)動(dòng)的操作封裝)
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) //設(shè)置最大的空閑數(shù)
db.SetMaxOpenConns(15) //設(shè)置最大的連接數(shù)
}
//db, err := sqlx.Open("數(shù)據(jù)庫(kù)類(lèi)型", "用戶名:密碼@tcp(地址:端口)/數(shù)據(jù)庫(kù)名")
3. SELECT數(shù)據(jù)庫(kù)查詢操作
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=utf8mb4&parseTime=true&loc=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)
}
得到結(jié)果->
[{1 張三 20 男} {2 李四 21 女} {3 王五 25 男}]
4. Insert數(shù)據(jù)庫(kù)插入操作
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("有多少行被創(chuàng)建", c)
}
得到結(jié)果->
有多少行被創(chuàng)建 1

5. Update數(shù)據(jù)庫(kù)更新操作
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)
}
得到結(jié)果->
有多少行被更改 1

6. DELETE數(shù)據(jù)庫(kù)刪除操作
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)
}
得到結(jié)果->
有多少行被刪除 1

三、生成動(dòng)態(tài)字段數(shù)據(jù)庫(kù)查詢結(jié)果
在項(xiàng)目中經(jīng)常會(huì)遇到一個(gè)問(wèn)題:在同一個(gè)函數(shù)中,查詢不同的表格,生成不同的結(jié)果,每次都要重新構(gòu)建結(jié)構(gòu)體
思路:把結(jié)果弄成[]map[string]string類(lèi)型,這樣就能把查詢得到的數(shù)據(jù)都填充進(jìn)去。
使用的是內(nèi)置的庫(kù)
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" //可以換成其它的查詢語(yǔ)句,可以得到相應(yīng)的查詢結(jié)果,不用每次都去構(gòu)建存放的結(jié)構(gòu)體
rows, err := db.Query(sqlStr)
if err != nil {
fmt.Println(err)
}
defer rows.Close()
//列出所有查詢結(jié)果的字段名
cols, _ := rows.Columns()
//values是每個(gè)列的值,這里獲取到byte里
values := make([][]byte, len(cols))
//query.Scan的參數(shù),因?yàn)槊看尾樵兂鰜?lái)的列是不定長(zhǎng)的,用len(cols)定住當(dāng)次查詢的長(zhǎng)度
scans := make([]interface{}, len(cols))
//讓每一行數(shù)據(jù)都填充到[][]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 { //每行數(shù)據(jù)是放在values里面,現(xiàn)在把它挪到row里
key := cols[k]
row[key] = string(v)
}
res = append(res, row)
}
fmt.Println(res)
}
得到結(jié)果->
[map[age:20 id:1 name:張三 sex:男] map[age:21 id:2 name:李四 sex:女] map[age:20 id:4 name:小六 sex:女]]
到此這篇關(guān)于Golang 數(shù)據(jù)庫(kù)操作(sqlx)和不定字段結(jié)果查詢的文章就介紹到這了,更多相關(guān)Golang 數(shù)據(jù)庫(kù)操作和不定字段結(jié)果查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用golang的字符串解決leetcode翻轉(zhuǎn)字符串里的單詞
這篇文章主要介紹了利用golang的字符串解決leetcode翻轉(zhuǎn)字符串里的單詞,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Go+Redis實(shí)現(xiàn)延遲隊(duì)列實(shí)操
這篇文章主要介紹了Go+Redis實(shí)現(xiàn)延遲隊(duì)列實(shí)操,延遲隊(duì)列是一種非常使用的數(shù)據(jù)結(jié)構(gòu),我們經(jīng)常有需要延遲推送處理消息的場(chǎng)景,比如延遲60秒發(fā)送短信,延遲30分鐘關(guān)閉訂單,消息消費(fèi)失敗延遲重試等2022-09-09
go語(yǔ)言中數(shù)據(jù)接口set集合的實(shí)現(xiàn)
set集合是一種常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),它代表了一個(gè)唯一元素的集合,本文主要介紹了set的基本特性,包括唯一性、無(wú)序性、可變性和集合運(yùn)算,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10
Go語(yǔ)言結(jié)合grpc和protobuf實(shí)現(xiàn)去中心化的聊天室
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言如何結(jié)合grpc和protobuf實(shí)現(xiàn)去中心化的聊天室,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
golang?metrics各個(gè)指標(biāo)含義講解說(shuō)明
這篇文章主要為大家介紹了golang?metrics各個(gè)指標(biāo)含義講解說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05

