如何利用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)文章希望大家以后多多支持腳本之家!