欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang 數(shù)據(jù)庫(kù)操作(sqlx)和不定字段結(jié)果查詢

 更新時(shí)間:2021年09月03日 09:06:01   作者:小小小丶葉子  
本文主要介紹了Golang 數(shù)據(jù)庫(kù)操作(sqlx)和不定字段結(jié)果查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(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ù)類型", "用戶名:密碼@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類型,這樣就能把查詢得到的數(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防止內(nèi)存逃逸的方法小結(jié)

    golang防止內(nèi)存逃逸的方法小結(jié)

    在Go語(yǔ)言中,內(nèi)存逃逸是指在函數(shù)中分配的變量在函數(shù)結(jié)束后仍然被引用,防止內(nèi)存逃逸有助于提高程序的性能,因?yàn)闂I戏峙涞膬?nèi)存可以更快地被回收,本文給大家總結(jié)了一些防止內(nèi)存逃逸的方法,需要的朋友可以參考下
    2024-02-02
  • 使用Go實(shí)現(xiàn)偽靜態(tài)URL重寫功能

    使用Go實(shí)現(xiàn)偽靜態(tài)URL重寫功能

    在Web開(kāi)發(fā)中,偽靜態(tài)URL已成為優(yōu)化網(wǎng)站架構(gòu)和提升SEO的常用技術(shù)手段,偽靜態(tài)URL是一種介于動(dòng)態(tài)URL和靜態(tài)URL之間的解決方案,本文給大家介紹了如何使用Go實(shí)現(xiàn)偽靜態(tài)URL重寫功能,需要的朋友可以參考下
    2024-08-08
  • golang簡(jiǎn)易令牌桶算法實(shí)現(xiàn)代碼

    golang簡(jiǎn)易令牌桶算法實(shí)現(xiàn)代碼

    這篇文章主要介紹了golang簡(jiǎn)易令牌桶算法實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Go語(yǔ)言集成開(kāi)發(fā)環(huán)境之VS Code安裝使用

    Go語(yǔ)言集成開(kāi)發(fā)環(huán)境之VS Code安裝使用

    VS Code是微軟開(kāi)源的一款編輯器,插件系統(tǒng)十分的豐富,下面介紹如何用VS Code搭建go語(yǔ)言開(kāi)發(fā)環(huán)境,需要的朋友可以參考下
    2021-10-10
  • go語(yǔ)言通過(guò)反射獲取和設(shè)置結(jié)構(gòu)體字段值的方法

    go語(yǔ)言通過(guò)反射獲取和設(shè)置結(jié)構(gòu)體字段值的方法

    這篇文章主要介紹了go語(yǔ)言通過(guò)反射獲取和設(shè)置結(jié)構(gòu)體字段值的方法,實(shí)例分析了Go語(yǔ)言反射的使用技巧,需要的朋友可以參考下
    2015-03-03
  • 精通Go語(yǔ)言日志記錄高效日志管理

    精通Go語(yǔ)言日志記錄高效日志管理

    本文將深入探討 Go 語(yǔ)言中的日志記錄,包括 Go 的標(biāo)準(zhǔn)日志庫(kù)的使用、流行的第三方日志庫(kù)以及如何在實(shí)際項(xiàng)目中實(shí)現(xiàn)有效的日志管理
    2023-11-11
  • Go 類型轉(zhuǎn)換工具包strconv包的用法

    Go 類型轉(zhuǎn)換工具包strconv包的用法

    Go 語(yǔ)言的?strconv?包提供了用于基本數(shù)據(jù)類型之間轉(zhuǎn)換的函數(shù),本文主要介紹了Go 類型轉(zhuǎn)換工具包strconv包的用法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • Go生成base64圖片驗(yàn)證碼實(shí)例(超詳細(xì)工具類)

    Go生成base64圖片驗(yàn)證碼實(shí)例(超詳細(xì)工具類)

    這段時(shí)間需要使用圖片驗(yàn)證碼庫(kù),下面這篇文章主要給大家介紹了關(guān)于Go生成base64圖片驗(yàn)證碼的相關(guān)資料,文中給出了詳細(xì)的實(shí)例代碼,需要的朋友可以參考下
    2023-06-06
  • Golang上下文Context的常見(jiàn)應(yīng)用場(chǎng)景

    Golang上下文Context的常見(jiàn)應(yīng)用場(chǎng)景

    Golang?context主要用于定義超時(shí)取消,取消后續(xù)操作,在不同操作中傳遞值。本文通過(guò)簡(jiǎn)單易懂的示例進(jìn)行說(shuō)明,感興趣的可以了解一下
    2023-04-04
  • Golang中文件目錄操作的實(shí)現(xiàn)步驟詳解

    Golang中文件目錄操作的實(shí)現(xiàn)步驟詳解

    在Golang中,文件目錄是指計(jì)算機(jī)文件系統(tǒng)中的文件夾或目錄。目錄是用于組織和存儲(chǔ)文件的一種方式,可以包含文件和其他子目錄,本文主要介紹了Golang中文件目錄操作的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2023-05-05

最新評(píng)論