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数据库的文章就介绍到这了,更多相关golang运用mysql数据库内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!