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

如何利用golang運用mysql數(shù)據(jù)庫

 更新時間:2022年03月16日 17:26:11   作者:峰啊瘋了  
這篇文章主要介紹了如何利用golang運用mysql數(shù)據(jù)庫,文章對依賴包、db對象注入ApiRouter等內(nèi)容,需要的小伙伴可以參考一下

1.依賴包

import (
? ? "database/sql"
? ? "fmt"
? ? _ "github.com/go-sql-driver/mysql"
)

如果忘記導(dǎo)入mysql依賴包會打不開mysql

2.main.go

package main

import (
? ? _ "container_cloud/pkg/config"
? ? "container_cloud/pkg/utils/httputil"
? ? "container_cloud/routers"
? ? "database/sql"
? ? "fmt"
? ? _ "github.com/go-sql-driver/mysql"
? ? "net/http"
? ? "time"
)

func init() {
? ? httputil.InitHttpTool()
}

// mysql
const (
? ? USERNAME = "root"
? ? PASSWORD = "Admin123"
? ? NETWORK ?= "tcp"
? ? // TODO ?本地調(diào)試時放開
? ? /*SERVER ? = "192.168.103.48"
? ? PORT ? ? = 43306*/

? ? // TODO 部署到環(huán)境時放開
? ? SERVER ? = "192.168.66.4"
? ? PORT ? ? = 3306
? ? DATABASE = "container_cloud"
)

func main() {
? ? var err error
? ? dsn := fmt.Sprintf("%s:%s@%s(%s:%d)/%s?parseTime=1&multiStatements=1&charset=utf8mb4&collation=utf8mb4_unicode_ci", USERNAME, PASSWORD, NETWORK, SERVER, PORT, DATABASE)

? ? db, err := sql.Open("mysql", dsn)
? ? if err != nil {
? ? ? ? fmt.Printf("Open mysql failed,err:%v\n", err)
? ? ? ? return
? ? }
? ? //最大連接周期,超過時間的連接就close
? ? db.SetConnMaxLifetime(100 * time.Second)
? ? //設(shè)置最大連接數(shù)
? ? db.SetMaxOpenConns(100)
? ? //設(shè)置閑置連接數(shù)
? ? db.SetMaxIdleConns(16)

? ? defer db.Close()

? ? container := routers.InitApiRouter(db)
? ? server := &http.Server{Addr: ":8090", Handler: container}
? ? server.ListenAndServe()
}

數(shù)據(jù)庫的一些設(shè)置

3.db對象注入ApiRouter

需要用到數(shù)據(jù)庫的模塊需要傳遞db對象

4.register層將db傳給controller

package v1alpha1

import (
? ? "container_cloud/pkg/api"
? ? "container_cloud/pkg/apiserver/query"
? ? "container_cloud/pkg/apiserver/runtime"
? ? "container_cloud/pkg/controller"
? ? "container_cloud/pkg/domain"
? ? "database/sql"
? ? "github.com/emicklei/go-restful"
? ? "k8s.io/apimachinery/pkg/runtime/schema"
? ? "net/http"
)

const (
? ? GroupName = "order.ictnj.io"
? ? Version ? = "v1alpha1"
)

var GroupVersion = schema.GroupVersion{Group: GroupName, Version: Version}

func AddToContainer(db *sql.DB) *restful.WebService{
? ? ws := runtime.NewWebService(GroupVersion)
? ? orderController := controller.NewOrderController(db)

? ? // 創(chuàng)建訂單接口,pvc創(chuàng)建、負載創(chuàng)建的時候,是在特定命名空間下。(其實請求入?yún)⒅幸灿忻臻g字段,資源創(chuàng)建的時候也可以從入?yún)⒅蝎@取)
? ? ws.Route(ws.POST("/namespaces/{namespace}/orders").
? ? ? ? To(orderController.CreateOrder).
? ? ? ? Param(ws.PathParameter("namespace", "namespace name")).
? ? ? ? Returns(http.StatusOK, api.StatusOK, map[string]string{}).
? ? ? ? Doc("create order."))

? ? return ws
}

5.controller層將db傳給service或者mapper

type orderController struct {
????Db *sql.DB
}

func NewOrderController(db *sql.DB) *orderController{
????return &orderController{Db: db}
}

// 再創(chuàng)建訂單
????orderService := service.NewOrderService(o.Db)
????orderService.CreateOrder(order)
????result := map[string]string{"message": "success"}
????response.WriteEntity(result)

6.架構(gòu)分析圖

當(dāng)邏輯比較簡單可以直接略過service,controller直接調(diào)用mapper

7.mapper示例

package service

import (
? ? "container_cloud/pkg/api"
? ? "container_cloud/pkg/apiserver/query"
? ? "container_cloud/pkg/domain"
? ? "database/sql"
? ? "encoding/json"
? ? "fmt"
? ? "github.com/google/uuid"
? ? "k8s.io/klog"
? ? "strings"
? ? "time"
)

type OrderService struct {
? ? Db *sql.DB
}

func NewOrderService(db *sql.DB) *OrderService{
? ? return &OrderService{Db: db}

}
func (o *OrderService) CreateOrder(order domain.Order) {
? ? order.CreateTime = time.Now()
? ? var orderType uint8 = 1
? ? order.OrderType = &orderType
? ? uuid,_ := uuid.NewRandom()
? ? order.Id = strings.ReplaceAll(uuid.String(), "-", "")

? ? jsonbyte, _ := json.Marshal(order.OrderItem)
? ? order.OrderItemJson = string(jsonbyte)

? ? o.insertData(order)
}

func (o *OrderService) insertData(order domain.Order) {
? ? stmt, _ := o.Db.Prepare(`INSERT INTO t_order (id, username, service_type, order_type, status, reason, order_item, create_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
? ? defer stmt.Close()

? ? ret, err := stmt.Exec(order.Id, order.Username, order.ServiceType, order.OrderType, order.Status, order.Reason, order.OrderItemJson, order.CreateTime)
? ? if err != nil {
? ? ? ? fmt.Printf("insert data error: %v\n", err)
? ? ? ? return
? ? }
? ? if LastInsertId, err := ret.LastInsertId(); nil == err {
? ? ? ? fmt.Println("LastInsertId:", LastInsertId)
? ? }
? ? if RowsAffected, err := ret.RowsAffected(); nil == err {
? ? ? ? fmt.Println("RowsAffected:", RowsAffected)
? ? }
}

func (o *OrderService) ListOrders(query *query.Query, username string) (*api.ListResult, error){
? ? // 查詢總數(shù)量
? ? totalRow, err := o.Db.Query("SELECT COUNT(*) FROM t_order WHERE username = ?", username)
? ? if err != nil {
? ? ? ? klog.Error("query orders count error", err)
? ? ? ? return nil, err
? ? }
? ? total := 0
? ? for totalRow.Next() {
? ? ? ? err := totalRow.Scan(
? ? ? ? ? ? &total,
? ? ? ? )
? ? ? ? if err != nil {
? ? ? ? ? ? klog.Error("query orders count error", err)
? ? ? ? ? ? continue
? ? ? ? }
? ? }
? ? totalRow.Close()

? ? // 查詢訂單列表
? ? rows, err := o.Db.Query("select * from t_order where username = ? order by create_time desc limit ? offset ? ", username, query.Pagination.Limit, query.Pagination.Offset)
? ? defer func() {
? ? ? ? if rows != nil {
? ? ? ? ? ? rows.Close()
? ? ? ? }
? ? }()
? ? if err != nil {
? ? ? ? klog.Error("query orders error", err)
? ? ? ? return nil, err
? ? }

? ? items := make([]interface{}, 0)
? ? for rows.Next() {
? ? ? ? order := new(domain.Order)
? ? ? ? err = rows.Scan(&order.Id, &order.Username, &order.ServiceType, &order.OrderType, &order.Status, &order.Reason, &order.OrderItemJson, &order.CreateTime)
? ? ? ? if err != nil {
? ? ? ? ? ? klog.Error("query orders error", err)
? ? ? ? ? ? return nil, err
? ? ? ? }
? ? ? ? order.OrderItemJson = ""
? ? ? ? items = append(items, *order)
? ? }

? ? return &api.ListResult{
? ? ? ? TotalItems: total,
? ? ? ? Items: ? ? ?items,
? ? }, nil

}

func (o *OrderService) GetOrder(id string) (*domain.Order, error) {
? ? order := new(domain.Order)
? ? row := o.Db.QueryRow("select order_item from t_order where id = ?", id)
? ? if err := row.Scan(&order.OrderItemJson); err != nil {
? ? ? ? klog.Error(err)
? ? ? ? return nil, err
? ? }
? ? orderItems := &[]domain.OrderItem{}
? ? json.Unmarshal([]byte(order.OrderItemJson), orderItems)

? ? order.OrderItemJson = ""
? ? order.OrderItem = *orderItems
? ? return order, nil
}


func (o *OrderService) ListUserOrders(username string) (*[]domain.Order, error){
? ? // 查詢訂單列表
? ? rows, err := o.Db.Query("select * from t_order where username = ? order by create_time desc", username)
? ? defer func() {
? ? ? ? if rows != nil {
? ? ? ? ? ? rows.Close()
? ? ? ? }
? ? }()
? ? if err != nil {
? ? ? ? klog.Error("query orders error", err)
? ? ? ? return nil, err
? ? }
? ? items := ?make([]domain.Order,0)
? ? for rows.Next() {
? ? ? ? order := new(domain.Order)
? ? ? ? err = rows.Scan(&order.Id, &order.Username, &order.ServiceType, &order.OrderType, &order.Status, &order.Reason, &order.OrderItemJson, &order.CreateTime)
? ? ? ? if err != nil {
? ? ? ? ? ? klog.Error("query orders error", err)
? ? ? ? ? ? return nil, err
? ? ? ? }
? ? ? ? order.OrderItemJson = ""
? ? ? ? items = append(items, *order)
? ? }

? ? return &items,nil
}

到此這篇關(guān)于如何利用golang運用mysql數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)golang運用mysql數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 高效封禁:利用Go封裝功能,提升封禁操作效率

    高效封禁:利用Go封裝功能,提升封禁操作效率

    在網(wǎng)絡(luò)安全領(lǐng)域,封禁操作是一項重要的任務(wù),用于阻止惡意行為和保護系統(tǒng)安全,而利用Go語言封裝功能可以提升封禁操作的效率,Go語言具有高效的并發(fā)性能和簡潔的語法,使得開發(fā)者可以快速構(gòu)建高性能的封禁系統(tǒng),
    2023-10-10
  • go交叉編譯sqlite報錯問題解決分析

    go交叉編譯sqlite報錯問題解決分析

    這篇文章主要為大家介紹了go交叉編譯sqlite報錯問題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Go語言使用字符串的幾個技巧分享

    Go語言使用字符串的幾個技巧分享

    這篇文章中小編將給出一些Go語言在處理字符串方面的技巧,對大家學(xué)習(xí)Go語言具有一定的參考借鑒價值,下面一起看看吧。
    2016-09-09
  • golang防止內(nèi)存逃逸的方法小結(jié)

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

    在Go語言中,內(nèi)存逃逸是指在函數(shù)中分配的變量在函數(shù)結(jié)束后仍然被引用,防止內(nèi)存逃逸有助于提高程序的性能,因為棧上分配的內(nèi)存可以更快地被回收,本文給大家總結(jié)了一些防止內(nèi)存逃逸的方法,需要的朋友可以參考下
    2024-02-02
  • golang實現(xiàn)京東支付v2版本的示例代碼

    golang實現(xiàn)京東支付v2版本的示例代碼

    這篇文章主要介紹了golang實現(xiàn)京東支付v2版本,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • sublime安裝支持go和html的插件

    sublime安裝支持go和html的插件

    這篇文章主要介紹了sublime安裝支持go和html的插件,需要的朋友可以參考下
    2015-01-01
  • Go并發(fā)同步Mutex典型易錯使用場景

    Go并發(fā)同步Mutex典型易錯使用場景

    這篇文章主要為大家介紹了Go并發(fā)同步Mutex典型易錯使用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Go語言Gin處理響應(yīng)方式詳解

    Go語言Gin處理響應(yīng)方式詳解

    gin框架封裝了常用的數(shù)據(jù)格式方法響應(yīng)于客戶端,下面這篇文章主要給大家介紹了關(guān)于Go語言Gin處理響應(yīng)方式的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • Go?語言進階單元測試示例詳解

    Go?語言進階單元測試示例詳解

    這篇文章主要為大家介紹了Go?語言進階單元測試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Golang官方限流器庫實現(xiàn)限流示例詳解

    Golang官方限流器庫實現(xiàn)限流示例詳解

    這篇文章主要為大家介紹了Golang官方限流器庫使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08

最新評論