怎么用golang运用mysql数据库
1.依赖包
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" )
如果忘记导入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 本地调试时放开 /*SERVER = "192.168.103.48" PORT = 43306*/ // TODO 部署到环境时放开 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) //设置最大连接数 db.SetMaxOpenConns(100) //设置闲置连接数 db.SetMaxIdleConns(16) defer db.Close() container := routers.InitApiRouter(db) server := &http.Server{Addr: ":8090", Handler: container} server.ListenAndServe() }
数据库的一些设置
3.db对象注入ApiRouter
需要用到数据库的模块需要传递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) // 创建订单接口,pvc创建、负载创建的时候,是在特定命名空间下。(其实请求入参中也有命名空间字段,资源创建的时候也可以从入参中获取) 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} } // 再创建订单 orderService := service.NewOrderService(o.Db) orderService.CreateOrder(order) result := map[string]string{"message": "success"} response.WriteEntity(result)
6.架构分析图
当逻辑比较简单可以直接略过service,controller直接调用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){ // 查询总数量 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 }
以上是怎么用golang运用mysql数据库的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

MySQL在数据库和编程中的地位非常重要,它是一个开源的关系型数据库管理系统,广泛应用于各种应用场景。1)MySQL提供高效的数据存储、组织和检索功能,支持Web、移动和企业级系统。2)它使用客户端-服务器架构,支持多种存储引擎和索引优化。3)基本用法包括创建表和插入数据,高级用法涉及多表JOIN和复杂查询。4)常见问题如SQL语法错误和性能问题可以通过EXPLAIN命令和慢查询日志调试。5)性能优化方法包括合理使用索引、优化查询和使用缓存,最佳实践包括使用事务和PreparedStatemen

Apache 连接数据库需要以下步骤:安装数据库驱动程序。配置 web.xml 文件以创建连接池。创建 JDBC 数据源,指定连接设置。从 Java 代码中使用 JDBC API 访问数据库,包括获取连接、创建语句、绑定参数、执行查询或更新以及处理结果。

解决 MySQL“Access denied for user”错误的办法:1. 检查用户连接数据库权限;2. 重新设置密码;3. 允许远程连接;4. 刷新权限;5. 检查数据库服务器配置(bind-address、skip-grant-tables);6. 检查防火墙规则;7. 重启 MySQL 服务。提示:备份数据库后进行更改。

C 更适合需要直接控制硬件资源和高性能优化的场景,而Golang更适合需要快速开发和高并发处理的场景。1.C 的优势在于其接近硬件的特性和高度的优化能力,适合游戏开发等高性能需求。2.Golang的优势在于其简洁的语法和天然的并发支持,适合高并发服务开发。

Golang在实际应用中表现出色,以简洁、高效和并发性着称。 1)通过Goroutines和Channels实现并发编程,2)利用接口和多态编写灵活代码,3)使用net/http包简化网络编程,4)构建高效并发爬虫,5)通过工具和最佳实践进行调试和优化。

使用 Navicat 自动备份 MySQL 数据的步骤:安装并连接到 MySQL 服务器。创建备份任务,指定备份来源、文件位置和名称。配置备份选项,包括备份类型、频率和保留时间。设置自动备份计划,启用自动备份、设置时间和频率。预览备份设置,然后执行备份。监控备份进度和历史记录。
