怎么用golang运用mysql数据库
1.依赖包import (
"
database/sql"
"
fmt"
_ "
github.com/go-sql-driver/mysql"
)
如果忘记导入mysql依赖包会打不开mysql
2.main.gopackage mainimport (
_ "
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传给controllerpackage v1alpha1import (
"
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或者mappertype 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 serviceimport (
"
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数据库,来提高开发效率。通过以下几个方面来具体探讨这个话题。
一、使用Golang与MySQL建立连接
在使用Golang与MySQL之间进行交互之前,必须要建立连接。首先要安装“database/sql”和“github.com/go-sql-driver/mysql”两个包。然后就可以在Golang代码中使用sql包的Open函数,连接MySQL数据库。需要注意的是,连接字符串中需正确填写用户名、密码、数据库名称、端口等信息。此外,还要根据情况设置连接的编码方式。连接成功后,就可以开始数据库操作。
二、使用Golang实现CRUD操作
CRUD是“增删改查”四个英文单词首字母的缩写,常用于描述数据库的基本操作。下面将结合具体代码,分别介绍如何使用Golang实现增、删、改、查这四个操作。在进行操作前,我们要先定义好数据表结构,并在Golang程序中定义相应的结构体。
1. 实现增加数据
要向MySQL数据库中添加新的数据,可以先使用Golang定义好需要插入的数据,然后使用Golang SQL包的Exec方法来执行SQL语句。下面是实现代码:
func insertDataToDB(db *sql.DB){
data:= User {Name:\"MengNan\", Age:14, Address: \"BeiJing\" }
stmt, err:=db.Prepare(\"INSERT INTO user SET name =? , age =? ,address =?\")
checkError(err)
res , err:=stmt.Exec(data.Name, data.Age, data.Address)
checkError(err)
lastInsertID, _:=res.LastInsertId()
fmt.Printf(\"Insert Success, the id is %d\
\", lastInsertID)
}
2. 实现删除数据
删除MySQL数据库中的数据,也可使用Golang SQL包的Exec方法来实现。下面是实现代码:
func deleteDataFromDB(db *sql.DB){
stmt,err := db.Prepare(\"delete from user where id = ?\")
checkError(err)
res,err:=stmt.Exec(1)
checkError(err)
affect,err:=res.RowsAffected()
checkError(err)
fmt.Printf(\"Delete Success, influenced lines: %d \
\",affect)
}
3. 实现修改数据
当需要修改MySQL数据库中的数据时,也可使用Golang SQL包中的Exec方法。下面是实现代码:
func modifyDataOfDB(db *sql.DB){
stmt,err := db.Prepare(\"update user set name = ?, address= ? where id = ?\")
checkError(err)
res,err:=stmt.Exec(\"NewName\",\"LA\",1)
checkError(err)
affect,err:=res.RowsAffected()
checkError(err)
fmt.Printf(\"Modify Success, influenced lines: %d\
\",affect)
}
4. 实现查询数据
从MySQL数据库中查询数据的方式有许多种,下面是常用的一种方式。使用Golang SQL包中的Query方法,执行SQL语句,然后将结果存入Golang的切片中。下面是实现代码:
func queryDataOfDB(db *sql.DB){
rows, err:= db.Query(\"select * from user\")
checkError(err)
defer rows.Close()
retriveData := make([]User, 0)
for rows.Next(){
data := User{}
err:= rows.Scan(&data.ID,&data.Name ,&data.Age, &data.Address)
checkError(err)
retriveData=append(retriveData, data)
}
fmt.Printf(\"Queried Success: %v\
\", retriveData)
}
三、使用Golang实现MySQL数据迁移
在实际开发中,如果我们的应用需要从一个MySQL数据库迁移到另一个MySQL数据库,此时仅手动操作会非常耗时。可以尝试使用Golang开发一个专门的工具,来自动执行这些操作。在实现开发过程中,我们只需编写好迁移的SQL语句和数据库连接信息,然后将这些配置封装到代码中即可。
总结
本文介绍了Golang如何运用MySQL数据库。首先讲解了Golang怎么与MySQL建立连接,然后讲解了如何使用Golang实现CRUD操作。最后,还介绍了如何使用Golang实现数据库的迁移。希望这篇文章对大家的Golang数据库开发有所帮助。