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

如何利用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)建、負(fù)載創(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?sync包中的互斥鎖Mutex和等待組WaitGroup使用詳解

    go?sync包中的互斥鎖Mutex和等待組WaitGroup使用詳解

    這篇文章主要為大家介紹了go?sync包中的互斥鎖Mutex和等待組WaitGroup使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • golang中的空接口使用詳解

    golang中的空接口使用詳解

    這篇文章主要介紹了golang中的空接口使用,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Golang空結(jié)構(gòu)體struct{}用途,你知道嗎

    Golang空結(jié)構(gòu)體struct{}用途,你知道嗎

    這篇文章主要介紹了Golang空結(jié)構(gòu)體struct{}用途,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Golang如何將上傳的文件壓縮成zip(小案例)

    Golang如何將上傳的文件壓縮成zip(小案例)

    這篇文章主要介紹了Golang如何將上傳的文件壓縮成zip(小案例),這是一個簡單的golang壓縮文件小案例,可做很多的拓展,這里使用的庫是archive/zip,在gopkg里面搜zip就行,需要的朋友可以參考下
    2024-01-01
  • golang通過cgo調(diào)用C++庫源碼示例

    golang通過cgo調(diào)用C++庫源碼示例

    這篇文章主要給大家介紹了關(guān)于golang通過cgo調(diào)用C++庫的相關(guān)資料,CGO是GO語言里面的一個特性,CGO屬于GOLANG的高級用法,主要是通過使用GOLANG調(diào)用CLANG實現(xiàn)的程序庫,需要的朋友可以參考下
    2024-02-02
  • Go語言框架快速集成限流中間件詳解

    Go語言框架快速集成限流中間件詳解

    這篇文章主要為大家介紹了Go語言框架快速集成限流中間件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 超全講解Golang中defer關(guān)鍵字的用法

    超全講解Golang中defer關(guān)鍵字的用法

    本文將從一個資源回收問題引入,引出defer關(guān)鍵字,并對其進(jìn)行基本介紹,從而讓大家對Go語言中的defer有更深入的了解,需要的小伙伴可以學(xué)習(xí)一下
    2023-05-05
  • Go語言設(shè)計模式之結(jié)構(gòu)型模式

    Go語言設(shè)計模式之結(jié)構(gòu)型模式

    本文主要聚焦在結(jié)構(gòu)型模式(Structural Pattern)上,其主要思想是將多個對象組裝成較大的結(jié)構(gòu),并同時保持結(jié)構(gòu)的靈活和高效,從程序的結(jié)構(gòu)上解決模塊之間的耦合問題
    2021-06-06
  • 詳解go語言json的使用技巧

    詳解go語言json的使用技巧

    這篇文章主要介紹了詳解go語言json的使用技巧,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • golang時間、時區(qū)、格式的使用方法

    golang時間、時區(qū)、格式的使用方法

    這篇文章主要介紹了golang時間、時區(qū)、格式的使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04

最新評論

尚义县| 山西省| 镇巴县| 繁昌县| 普格县| 湘阴县| 正安县| 榕江县| 桃源县| 南平市| 大同县| 邯郸市| 墨脱县| 泸西县| 大悟县| 洛扎县| 郴州市| 邹平县| 确山县| 石棉县| 蓬莱市| 凤台县| 德钦县| 响水县| 镇雄县| 阜南县| 黎平县| 新干县| 白水县| 巴林左旗| 裕民县| 博白县| 遂川县| 乃东县| 东丽区| 崇礼县| 鄱阳县| 丰都县| 额敏县| 阿尔山市| 邓州市|