How to use golang to use mysql database
1. Dependency package
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" )
If you forget to import the mysql dependency package, mysql will not open
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() }
Some settings of the database
3.db object injection into ApiRouter
Modules that need to use the database need to be passed db object
4. The register layer passes the db to the 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. The controller layer passes the db to the service or 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. Architecture analysis diagram
When the logic is relatively simple, you can directly skip the service, and the controller directly calls mapper
7.mapper example
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 }
The above is the detailed content of How to use golang to use mysql database. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



MySQL's position in databases and programming is very important. It is an open source relational database management system that is widely used in various application scenarios. 1) MySQL provides efficient data storage, organization and retrieval functions, supporting Web, mobile and enterprise-level systems. 2) It uses a client-server architecture, supports multiple storage engines and index optimization. 3) Basic usages include creating tables and inserting data, and advanced usages involve multi-table JOINs and complex queries. 4) Frequently asked questions such as SQL syntax errors and performance issues can be debugged through the EXPLAIN command and slow query log. 5) Performance optimization methods include rational use of indexes, optimized query and use of caches. Best practices include using transactions and PreparedStatemen

Apache connects to a database requires the following steps: Install the database driver. Configure the web.xml file to create a connection pool. Create a JDBC data source and specify the connection settings. Use the JDBC API to access the database from Java code, including getting connections, creating statements, binding parameters, executing queries or updates, and processing results.

C is more suitable for scenarios where direct control of hardware resources and high performance optimization is required, while Golang is more suitable for scenarios where rapid development and high concurrency processing are required. 1.C's advantage lies in its close to hardware characteristics and high optimization capabilities, which are suitable for high-performance needs such as game development. 2.Golang's advantage lies in its concise syntax and natural concurrency support, which is suitable for high concurrency service development.

The process of starting MySQL in Docker consists of the following steps: Pull the MySQL image to create and start the container, set the root user password, and map the port verification connection Create the database and the user grants all permissions to the database

Goimpactsdevelopmentpositivelythroughspeed,efficiency,andsimplicity.1)Speed:Gocompilesquicklyandrunsefficiently,idealforlargeprojects.2)Efficiency:Itscomprehensivestandardlibraryreducesexternaldependencies,enhancingdevelopmentefficiency.3)Simplicity:

Installing MySQL on CentOS involves the following steps: Adding the appropriate MySQL yum source. Execute the yum install mysql-server command to install the MySQL server. Use the mysql_secure_installation command to make security settings, such as setting the root user password. Customize the MySQL configuration file as needed. Tune MySQL parameters and optimize databases for performance.

The key to installing MySQL elegantly is to add the official MySQL repository. The specific steps are as follows: Download the MySQL official GPG key to prevent phishing attacks. Add MySQL repository file: rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm Update yum repository cache: yum update installation MySQL: yum install mysql-server startup MySQL service: systemctl start mysqld set up booting

Golang and C each have their own advantages in performance competitions: 1) Golang is suitable for high concurrency and rapid development, and 2) C provides higher performance and fine-grained control. The selection should be based on project requirements and team technology stack.
