最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年09月03日 09:06:01   作者:小小小丶葉子  
本文主要介紹了Golang 數(shù)據(jù)庫操作(sqlx)和不定字段結果查詢,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、Mysql數(shù)據(jù)庫

為什么要使用數(shù)據(jù)庫

  • 一開始人手動記錄數(shù)據(jù),不能長期保存,追溯;
  • 然后創(chuàng)建了文件系統(tǒng),能夠長期保存,但是查詢追溯更新麻煩,數(shù)據(jù)可以發(fā)生冗余重復;
  • 實現(xiàn)了數(shù)據(jù)庫的方式,能夠長期保存,方便查詢,追溯,更新等等一系列操作,能設置一些約束進行數(shù)據(jù)的自我管控等等。

簡單介紹下Mysql數(shù)據(jù)庫的特點:關系型數(shù)據(jù)庫、體積小、速度快、成本低、開源代碼、中小網站適用、非常適合初學者學習

二、Golang操作Mysql

1. 現(xiàn)有test數(shù)據(jù)庫表格user

2. 連接mysql數(shù)據(jù)庫

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) //設置最大的空閑數(shù)
   db.SetMaxOpenConns(15) //設置最大的連接數(shù)
}

  //db, err := sqlx.Open("數(shù)據(jù)庫類型", "用戶名:密碼@tcp(地址:端口)/數(shù)據(jù)庫名")

3. SELECT數(shù)據(jù)庫查詢操作

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)
}

得到結果->

[{1 張三 20 男} {2 李四 21 女} {3 王五 25 男}]

4. Insert數(shù)據(jù)庫插入操作

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)
}

得到結果->

有多少行被創(chuàng)建 1

5. Update數(shù)據(jù)庫更新操作

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數(shù)據(jù)庫刪除操作

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

三、生成動態(tài)字段數(shù)據(jù)庫查詢結果

在項目中經常會遇到一個問題:在同一個函數(shù)中,查詢不同的表格,生成不同的結果,每次都要重新構建結構體

思路:把結果弄成[]map[string]string類型,這樣就能把查詢得到的數(shù)據(jù)都填充進去。

使用的是內置的庫

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的參數(shù),因為每次查詢出來的列是不定長的,用len(cols)定住當次查詢的長度
   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)
}

得到結果->

[map[age:20 id:1 name:張三 sex:男] map[age:21 id:2 name:李四 sex:女] map[age:20 id:4 name:小六 sex:女]]

到此這篇關于Golang 數(shù)據(jù)庫操作(sqlx)和不定字段結果查詢的文章就介紹到這了,更多相關Golang 數(shù)據(jù)庫操作和不定字段結果查詢內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • 利用golang的字符串解決leetcode翻轉字符串里的單詞

    利用golang的字符串解決leetcode翻轉字符串里的單詞

    這篇文章主要介紹了利用golang的字符串解決leetcode翻轉字符串里的單詞,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go 中燒腦的接口及空接口

    Go 中燒腦的接口及空接口

    在Go語言的實際編程中,幾乎所有的數(shù)據(jù)結構都圍繞接口展開,接口是Go語言中所有數(shù)據(jù)結構的核心,這篇文章主要介紹了Go 中燒腦的接口,需要的朋友可以參考下
    2024-02-02
  • Go+Redis實現(xiàn)延遲隊列實操

    Go+Redis實現(xiàn)延遲隊列實操

    這篇文章主要介紹了Go+Redis實現(xiàn)延遲隊列實操,延遲隊列是一種非常使用的數(shù)據(jù)結構,我們經常有需要延遲推送處理消息的場景,比如延遲60秒發(fā)送短信,延遲30分鐘關閉訂單,消息消費失敗延遲重試等
    2022-09-09
  • 一文帶你深入理解Golang Context包

    一文帶你深入理解Golang Context包

    在 Go 語言中,Context 包是一種非常常用的工具,它被用來管理 goroutine 之間的通信和取消。本文將深入探討Context 包的基本原理,包括使用場景、原理和一些最佳實踐,需要的可以參考下
    2023-05-05
  • golang?beego框架路由ORM增刪改查完整案例

    golang?beego框架路由ORM增刪改查完整案例

    這篇文章主要為大家介紹了golang?beego框架路由ORM增刪改查完整案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • go語言中數(shù)據(jù)接口set集合的實現(xiàn)

    go語言中數(shù)據(jù)接口set集合的實現(xiàn)

    set集合是一種常見的數(shù)據(jù)結構,它代表了一個唯一元素的集合,本文主要介紹了set的基本特性,包括唯一性、無序性、可變性和集合運算,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-10-10
  • 使用Go語言編寫HTTP中間件的示例詳解

    使用Go語言編寫HTTP中間件的示例詳解

    在Go語言中,HTTP中間件是一種處理HTTP請求和響應的函數(shù),它可以攔截到請求并對其進行處理,然后再將請求傳遞給下一個中間件或目標處理程序,本文給大家介紹了使用Go語言編寫HTTP中間件的示例,文中有相關的代碼示例供大家參考,需要的朋友可以參考下
    2024-01-01
  • 淺談Go語言的高效編碼細節(jié)

    淺談Go語言的高效編碼細節(jié)

    這篇文章主要介紹了淺談Go語言的高效編碼細節(jié),我們都知道golang是天生的高并發(fā),高效的編譯型語言,可我們也都可知道,工具再好,用法不對,全都白費,我們來舉2個常用路徑來感受一下
    2023-01-01
  • Go語言結合grpc和protobuf實現(xiàn)去中心化的聊天室

    Go語言結合grpc和protobuf實現(xiàn)去中心化的聊天室

    這篇文章主要為大家詳細介紹了Go語言如何結合grpc和protobuf實現(xiàn)去中心化的聊天室,文中的示例代碼講解詳細,有需要的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • golang?metrics各個指標含義講解說明

    golang?metrics各個指標含義講解說明

    這篇文章主要為大家介紹了golang?metrics各個指標含義講解說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05

最新評論

定日县| 安新县| 山丹县| 海南省| 兴隆县| 天等县| 连江县| 石台县| 富阳市| 米泉市| 琼中| 河东区| 赤城县| 玛多县| 布拖县| 固安县| 青神县| 洞头县| 竹溪县| 芜湖市| 上虞市| 夏津县| 凌源市| 霍林郭勒市| 衡阳县| 宁明县| 贵州省| 吐鲁番市| 嘉祥县| 延边| 广元市| 来凤县| 怀远县| 玉屏| 阿鲁科尔沁旗| 尼玛县| 城固县| 北流市| 惠水县| 威宁| 阿坝|