GO MySQL數據庫操作封裝

Go? 語言操作數據庫,

數據庫連接封裝:

package Test_dbimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""log""sync"
)var (DB       *sql.DBpoolOnce sync.Once
)func NewConnection() (*sql.DB, error) {m_db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/Test")if err != nil {// fmt.Println("數據源的名稱不合法!")log.Fatalln("db connect err:", err)return nil, err}//Ping檢查與數據庫的連接是否仍有效,如果需要會創建連接。connect_err := m_db.Ping()if connect_err != nil {log.Fatalf("連接失敗!error:%v", connect_err)return nil, err}// fmt.Println("連接數據庫成功")m_db.SetMaxIdleConns(100)m_db.SetMaxOpenConns(300)// m_db.SetConnMaxLifetime(time.Second * 300)m_db.SetConnMaxLifetime(0)DB = m_db//結構體實例化GetDBStats()return m_db, nil
}func GetDB() (*sql.DB, error) {var err errorpoolOnce.Do(func() {DB, err = NewConnection()if err != nil {fmt.Println("Connection err :", err)}})err = DB.Ping()if err != nil {DB.Close()DB, err = NewConnection()if err != nil {return nil, err}}return DB, nil
}func GetDBStats() {info1 := fmt.Sprintf("數據庫狀態 :\n最大連接數:%d,  當前總連接數;%d,  已使用: %d, 空閑數量:%d \n",DB.Stats().MaxOpenConnections,DB.Stats().OpenConnections,DB.Stats().InUse,DB.Stats().Idle)info2 := fmt.Sprintf("等待連接數量:%d,  等待創建新連接時長(秒):%f, 空閑超限關閉數量:%d, 空閑超時關閉數量:%d, 連接超時關閉數量:%d \n",DB.Stats().WaitCount,DB.Stats().WaitDuration.Seconds(),DB.Stats().MaxIdleClosed,DB.Stats().MaxIdleTimeClosed,DB.Stats().MaxLifetimeClosed,)info := info1 + info2_, _ = fmt.Println(info)
}

數據庫操作封裝:

package Test_dbimport ("database/sql""encoding/json""errors""fmt""log""reflect""strings"utils 
)func QueryRecord(sql string) (string, error) {conn, err := GetDB()if err != nil {return " ", err}stm, pre_err := conn.Prepare(sql)if pre_err != nil {return " ", errors.New("QueryRecord prepare err: " + pre_err.Error())}defer stm.Close()rows, err := stm.Query()if err != nil {return " ", err}defer rows.Close()columns, err := rows.Columns()if err != nil {return " ", err}count := len(columns)value := make([]map[string]interface{}, 0)for rows.Next() {values := make([]interface{}, count)valuePtrs := make([]interface{}, count)for i, _ := range columns {valuePtrs[i] = &values[i]}if err := rows.Scan(valuePtrs...); err != nil {log.Fatal(err)}var m map[string]interface{}m = make(map[string]interface{})for i := range columns {var v interface{}val := values[i]b, ok := val.([]byte)if ok {str := string(b)if (strings.HasPrefix(str, "{") && strings.HasSuffix(str, "}")) ||(strings.HasPrefix(str, "[{") && strings.HasSuffix(str, "}]")) {_ = json.Unmarshal([]byte(str), &v)} else {v = string(b)}} else {v = val}m[columns[i]] = v}value = append(value, m)}jsonValue, err := json.Marshal(value)if err != nil {return " ", err}return string(jsonValue), nil
}func InsertDB(strTableName string, jsonValue interface{}) (int64, error) {strSql := fmt.Sprintf("INSERT INTO  %v  ( ", strTableName)var parms []stringparms = utils.GetNameJosnValue(jsonValue)for i, v := range parms {if i == len(parms)-1 {strSql += "`" + v + "`"} else {strSql += "`" + v + "`, "}}strSql += ") VALUES "vals := []interface{}{}sqlQuery := fmt.Sprintf("(%s)", strings.Join(strings.Split(strings.Repeat("?", len(parms)), ""), ","))var n sql.NullStringswitch obj := jsonValue.(type) {case map[string]interface{}:strSql += sqlQueryfor _, k := range parms {s := utils.GetNameToStringValue(k, obj)if len(s) == 0 {vals = append(vals, n)} else {vals = append(vals, s)}}case []interface{}:for index, v := range obj {if index == len(obj)-1 {strSql += sqlQuery} else {strSql += sqlQuery + ", "}m := v.(map[string]interface{})for _, k := range parms {s := utils.GetNameToStringValue(k, m)if len(s) == 0 {vals = append(vals, n)} else {vals = append(vals, s)}}}default:fmt.Println("type:", reflect.TypeOf(obj), "value: \n", obj)}conn, err := GetDB()if err != nil {return 0, err}tx, _ := conn.Begin()stmt, err := conn.Prepare(strSql)if err != nil {fmt.Printf("prepare failed, err:%v\n", err)return 0, err}defer stmt.Close()res, err := stmt.Exec(vals...)if err != nil {fmt.Println("err: ", err)fmt.Println("err: ", err.Error())tx.Rollback()return 0, err}tx.Commit() // 提交事務id, _ := res.LastInsertId()fmt.Printf("lastId: %d insert success! /n", id)return id, err
}func UpdateDB(strTableName string, jsonValue interface{}, strCondition string) (bool, error) {strValues := ""switch obj := jsonValue.(type) {case map[string]interface{}:for k, _ := range obj {fmt.Println("k:", k, " \n")if strValues == "" {fmt.Println("k2:", k, " \n")strValues = fmt.Sprintf("%v='%v'", k, utils.GetNameToStringValue(k, obj))} else {strValues += fmt.Sprintf(",%v='%v'", k, utils.GetNameToStringValue(k, obj))}}case []interface{}:fmt.Println("Multiple updates are currently not supported !")breakfor _, v := range obj {m := v.(map[string]interface{})for k, _ := range m {if strValues == "" {strValues = fmt.Sprintf("%v='%v'", k, utils.GetNameToStringValue(k, m))} else {strValues += fmt.Sprintf(",%v='%v'", k, utils.GetNameToStringValue(k, m))}}}default:fmt.Println("type:", reflect.TypeOf(obj), "value: \n", obj)}if strValues == "" {return false, nil}strSql := fmt.Sprintf("UPDATE %v  SET %v  %v  ", strTableName, strValues, strCondition)vals := []interface{}{}conn, err := GetDB()if err != nil {return false, err}res, err := conn.Exec(strSql, vals...)if err != nil {return false, err}id, _ := res.LastInsertId()fmt.Printf("lastId: %d insert success! /n", id)return true, nil
}func Delete(strSql string) (bool, error) {conn, err := GetDB()if err != nil {return false, err}res, err := conn.Exec(strSql)if err != nil {return false, err}fmt.Printf("res:%v  /n", res)return true, err
}func Exec(strSql string) (bool, error) {conn, err := GetDB()if err != nil {return false, err}res, err := conn.Exec(strSql)if err != nil {return false, err}fmt.Printf("res:%v  /n", res)return true, err
}

Go 語言返回的也是json 格式,注意接口和map? 數組的轉換

utils 工具

package Test_utilsimport ("encoding/json""fmt""reflect""strconv""strings"
)/*
bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null
種類(Kind)指的是對象歸屬的品種,在 reflect 包中有如下定義:
Invalid Kind = iota  // 非法類型
Bool								 // 布爾型
Int								   // 有符號整型
Int8								 // 有符號8位整型
Int16								 // 有符號16位整型
Int32								 // 有符號32位整型
Int64								 // 有符號64位整型
Uint								 // 無符號整型
Uint8								 // 無符號8位整型
Uint16							 // 無符號16位整型
Uint32							 // 無符號32位整型
Uint64							 // 無符號64位整型
Uintptr							 // 指針
Float32							 // 單精度浮點數
Float64							 // 雙精度浮點數
Complex64						 // 32位復數類型
Complex128					 // 64位復數類型
Array								 // 數組
Chan								 // 通道
Func								 // 函數
Interface						 // 接口
Map								   // 映射
Ptr								   // 指針
Slice								 // 切片
String							 // 字符串
Struct							 // 結構體
UnsafePointer				 // 底層指針
*/func GetNameJosnValue(jsonValue interface{}) []string {var parms []stringswitch obj := jsonValue.(type) {case map[string]interface{}:for k, _ := range obj {parms = append(parms, k)}case []interface{}:for _, v := range obj {for m, _ := range v.(map[string]interface{}) {parms = append(parms, m)}return parms}default:fmt.Println("type:", reflect.TypeOf(obj), "value: \n", obj)}return parms
}func GetNameToStringValue(k string, m map[string]interface{}) string {value := ""objCheck := reflect.ValueOf(m[k])switch objCheck.Kind() {case reflect.String:value = m[k].(string)case reflect.Int:value = string(m[k].(int))case reflect.Int32:value = string(m[k].(int32))case reflect.Int64:value = strconv.FormatInt(m[k].(int64), 10)case reflect.Float32:value = fmt.Sprintf("%f", m[k].(float32))case reflect.Float64:value = strconv.FormatFloat(m[k].(float64), 'f', -1, 64)case reflect.Map:result, err := json.Marshal(m[k])if err != nil {fmt.Println("json Marshal failed :", err)}value = string(result)case reflect.Slice:tmp := m[k].([]interface{})result, err := json.Marshal(tmp)if err != nil {fmt.Println("json Marshal failed :", err)}value = string(result)case reflect.Interface:for _, v := range m {for t, _ := range v.(map[string]interface{}) {value = string(t)}}default:fmt.Printf("m[k] %v is of unknown type :", m[k], reflect.TypeOf(m[k]))}return value
}func InterfaceToMapByReflection(v interface{}) map[string]interface{} {result := make(map[string]interface{})fmt.Println("InterfaceToMapByReflection v:", reflect.TypeOf(v))switch obj := v.(type) {case map[string]interface{}:result = objcase []interface{}:for _, v := range obj {result = v.(map[string]interface{})break}default:fmt.Println("type:", reflect.TypeOf(obj), "value: \n", obj)}return result
}func SplitSeps(s string, seps ...string) interface{} {result := []interface{}{}if len(seps) == 0 {return result}tmp := strings.Split(s, seps[0])for _, sep := range seps[1:] {for _, r := range tmp {temp := strings.Split(r, sep)m := make(map[string]interface{})m["key"] = temp[0]m["value"] = temp[1]result = append(result, m)}}return result
}func SplitSepsToArray(s string, seps ...string) []string {if len(seps) == 0 {return []string{s}}result := strings.Split(s, seps[0])for _, sep := range seps[1:] {var temp []stringfor _, r := range result {temp = append(temp, strings.Split(r, sep)...)}result = temp}return result
}func Split(s, sep string) []string {if s == "" {return nil}return strings.Split(s, sep)
}func MapToJson(i interface{}) string {//將map數據轉化為JSON格式字符串bytes, err := json.Marshal(i)//判斷是否轉換成功if err != nil {fmt.Println("JSON格式轉換失敗,錯誤信息為:", err)}return string(bytes)
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161455.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161455.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信小程序藍牙連接 uniApp藍牙連接設備

藍牙列表期待效果 代碼 <template><view class"bluetooth-list"><view class"align-items option" style"justify-content: space-between;" v-for"item in bluetoothList" :key"item.deviceId"><vie…

游戲開發團隊配置與協作流程

游戲開發技術圖譜 - 知乎 游戲制作的流程是什么啊&#xff1f; - 知乎 系統策劃&#xff1a;一張圖梳理游戲系統的生產流程 - 知乎 游戲開發入門&#xff08;十一&#xff09;游戲引擎架構-CSDN博客

全局定制序列化

作用:將返回實體類中的屬性如果為null 變成"" package com.example.micrweb.config;import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.f…

linux驅動——原子操作

linux驅動——原子操作 原子操作 API Linux 內核定義了叫做 atomic_t 的結構體來完成整型數據的原操作&#xff0c;在使用是使用原子變量來代替整型變量。此結構體定義在 include/linux/types.h 文件中&#xff0c;定義如下&#xff1a; typedef struct {int counter; }atom…

websocket與node.js實現

什么是 websocket&#xff1f; websoket 是一種網絡通信協議&#xff0c;基于 tcp 連接的全雙工通信協議&#xff08;客戶端和服務器可以同時收發信息&#xff09;&#xff0c;值得注意的是他不基于 http 協議&#xff0c;websocket 只有在建立連接的時候使用到 http 協議進行…

Kubernetes(k8s)之Pod詳解

文章目錄 Kubernetes之Pod詳解一、Pod介紹pod結構pod定義 二、Pod配置pod基本配置鏡像拉取策略啟動命令環境變量端口設置資源配額 三、Pod生命周期創建和終止初始化容器鉤子函數容器探測重啟策略 四、Pod調度定向調度NodeNameNodeSelector 親和性調度NodeAffinityPodAffinityPo…

風電場葉片運輸車模型-FBX格式-帶動畫-數字孿生場景搭建

FBX格式的風電場中葉片運輸車輛模型&#xff0c;按照真實尺寸建模&#xff0c;車輛多個部位帶動畫效果&#xff0c;適用于風電場三維數字化場景和風電場數字孿生使用&#xff0c;也可以用來作為各種三維平臺的測試模型。 模型效果圖 下載地址 葉片運輸車模型下載地址

php生成xml數據

在PHP中&#xff0c;你可以使用以下幾種方法生成XML數據&#xff1a; 使用DOM擴展&#xff1a; $xml new DOMDocument(1.0, UTF-8); $root $xml->createElement(root); $xml->appendChild($root); $child $xml->createElement(child); $root->appendChild($ch…

使用 Raspberry Pi、Golang 和 HERE XYZ 制作實時地圖

到目前為止&#xff0c;您可能已經看過我的一些與 Raspberry Pi 和位置數據相關的教程。我是這些小型物聯網 (IoT) 設備的忠實粉絲&#xff0c;并編寫了有關使用 Golang 進行 WLAN 定位 和 使用 Node.js 進行 GPS 定位的教程。 我想繼續沿著 Golang 路線&#xff0c;做一個關于…

目標檢測YOLO實戰應用案例100講-基于YOLO的小目標檢測改進算法

目錄 前言 國內外研究現狀 常規尺寸目標檢測算法 小目標的檢測算法

stm32定時器輸入捕獲模式

頻率測量 頻率測量有兩種方法 測頻法&#xff1a;在閘門時間T內&#xff0c;對上升沿或下降沿計次&#xff0c;得到N&#xff0c;則評率fxN/T測周法&#xff1a;兩個上升沿內&#xff0c;以標準頻率fc計次得到N&#xff0c;則頻率fx fc/N中界頻率&#xff1a;測頻法和測周法誤…

Spark的通用運行流程與Spark YARN Cluster 模式的運行流程

Spark的通用運行流程 集群啟動后Worker節點會向Master節點心跳匯報資源Client向Driver提交APP&#xff0c;根據不同的運行模式在不同的地方創建Driver。Driver以粗粒度的方式向Master注冊應用并申請資源&#xff08;在Application執行之前&#xff0c;將所有的資源申請完畢&…

助力企業前行——ScalaSpark最佳實踐課程

時間飛逝&#xff0c;轉眼間我們的Scala&Spark培訓課程已經圓滿結束&#xff01;在這段精彩的學習旅程中&#xff0c;你們展現了堅韌、決心和追求卓越的品質。 scala(Scalable Language)是一種多范式的編程語言&#xff0c;其設計的初衷是要集成面向對象編程和函數式編程的…

Cookie與Session知識

目錄 一.Cookie與Session的發展史 1.Cookie的發展史 2.Session的發展史 3.Cookie和Session的關系 4.總結 二.Cookie與Session詳解 1.Cookie 2.Session 3.token 4.總結 三.Django操作Cookie 1.設置Cookie 2.獲取Cookie 3.設置超時時間 4.注銷Cookie 5.登錄功能實…

【機器學習】On the Identifiability of Nonlinear ICA: Sparsity and Beyond

前言 本文是對On the Identifiability of Nonlinear ICA: Sparsity and Beyond (NIPS 2022)中兩個結構稀疏假設的總結。原文鏈接在Reference中。 什么是ICA(Independent component analysis)&#xff1f; 獨立成分分析簡單來說&#xff0c;就是給定很多的樣本X&#xff0c;通…

Springboot-熱部署-IDEA2023

方式一&#xff1a;jrebel 方式二&#xff1a; 1、導入依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <…

C++ DAY08 異常

概念 異常事件&#xff08;如&#xff1a;除 0 溢出&#xff0c;數組下標越界&#xff0c;所要讀取的文件不存在 , 空指針&#xff0c;內存不足 等等&#xff09; 在 C 語言對錯誤的處理是兩種方法&#xff1a; 一是使用整型的返回值標識錯誤&#xff1b; 二是使用 errn…

自動解決IP沖突的問題 利用批處理更改末位IP循環+1直到網絡暢通為止 解放雙手 事半功倍

好久沒出來寫點什么了&#xff0c;難道今天有點時間&#xff0c;順便把這兩天碰到的問題出個解決方法吧。 這幾天去客戶那兒解決網絡問題&#xff0c;因為客戶的網絡是固定的靜態IP&#xff0c;因為沒做MAC綁定&#xff0c;IP固定在本地電腦上&#xff0c;只要上不了網&#xf…

PDF轉Word,1行Python代碼就夠了,免費用

大家好&#xff0c;這里是程序員晚楓。 今年十一假期沒出去旅游&#xff0c;在家里更新一套原創課程&#xff0c;&#x1f449;給小白的《50講Python自動化辦公》。 所有功能&#xff0c;都只需要1行代碼&#xff0c;非常適合非程序員入門Python使用。 目前全網播放量直逼100…

RK3588平臺開發系列講解(嵌入式AI篇)RKNPU詳解

文章目錄 一、CPU、GPU、FPGA和NPU介紹二、CPU、GPU、FPGA和NPU區別三、NPU 應用四、RKNPU沉淀、分享、成長,讓自己和他人都能有所收獲!?? ?? 本篇將給大家介紹什么是RKNPU。 一、CPU、GPU、FPGA和NPU介紹 二、CPU、GPU、FPGA和NPU區別 若考慮成本、功耗、計算能力以及體…