title: Golang连接Mysql数据库并进行增删改查
date: 2023-01-06 23:55:14.0
updated: 2023-01-07 11:09:48.0
url: https://liumou.site/doc/596
categories:

  • 数据库
  • Mariadb
  • GO
    tags:
  • Go
  • Mariadb

源码

package main

import (
    "fmt"
    "gitee.com/liumou_site/logger"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
    "os"
)

type MysqlApi struct {
    UserName string   // 数据库登录用户名
    Password string   // 数据库登录密码
    Host     string   // 数据库登录地址
    Port     int      // 数据库端口
    DbName   string   // 数据库名称
    Charset  string   // 字符编码
    Db       *sqlx.DB // 数据库实例
}
type Person struct {
    UserId   int    `db:"id"`
    UserName string `db:"name"`
    UserAge  int    `db:"age"`
}

func MysqlConfig() *MysqlApi {
    Login := new(MysqlApi)
    Login.Charset = "utf8"   // 字符编码
    Login.UserName = "root"  // 登录用户
    Login.Port = 3306        // 数据库端口
    Login.Host = "127.0.0.1" // 数据库登录地址
    Login.Password = "1"     // 数据库登录密码
    Login.DbName = "liumou"  // 数据库名称
    Arg := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", Login.UserName, Login.Password, Login.Host, Login.Port, Login.DbName, Login.Charset)
    fmt.Println(Arg)
    Db, err := sqlx.Open("mysql", Arg)
    if err != nil {
        logger.Error("数据库连接失败, 详细信息: ", err.Error())
        os.Exit(1)
    }
    Login.Db = Db
    return Login

}

// AddUser 在数据表中添加用户信息
func (sql *MysqlApi) AddUser() {
    for i := 2; i < 5; i++ {
        result, err := sql.Db.Exec("insert into demo  values(?,?,?)", i, "刘德华", 18)
        if err != nil {
            logger.Error("数据插入失败,详细信息: ", err.Error())
            return
        }
        id, _ := result.LastInsertId()
        logger.Info("数据插入成功,ID: ", id)
    }
}

// UpdateName 更新id值1的用户名
func (sql *MysqlApi) UpdateName() {
    result, err := sql.Db.Exec("update demo set name = '刘亦菲' where id = 1")
    if err != nil {
        logger.Error("更新失败, 详细信息: ", err.Error())
        return
    }
    num, _ := result.RowsAffected()
    logger.Info("更新成功,影响的行数: ", num)
}

// DeleteUser 删除ID值2的用户
func (sql *MysqlApi) DeleteUser() {
    result, err := sql.Db.Exec("delete from demo where id = 2")
    if err != nil {
        logger.Error("删除失败, 详细信息: ", err.Error())
        return
    }
    num, _ := result.RowsAffected()
    logger.Info("删除成功,影响的行数: ", num)
}

// SelectUser 查询用户信息
func (sql *MysqlApi) SelectUser() {
    var person []Person
    // 手动关闭连接,模拟程序自动断开连接
    err := sql.Db.Close()
    if err != nil {
        return
    }
    // 判断当前连接是否正常,如果已断开则重新连接
    if err := sql.Db.Ping(); err != nil {
        logger.Error("连接已断开,正在重新连接")
        sqlps := MysqlConfig()
        sql.Db = sqlps.Db
    }
    err = sql.Db.Select(&person, "select * from liumou.demo;")
    if err != nil {
        //fmt.Printf("查询失败, 详细信息:[%v]", err.Error())
        logger.Error("查询失败:", err)
    } else {
        logger.Info("查询成功,数据如下")
        fmt.Println(person)
    }
}
func main() {
    mysql := MysqlConfig()
    mysql.AddUser()
    mysql.UpdateName()
    mysql.DeleteUser()
    mysql.SelectUser()
    err := mysql.Db.Close()
    if err != nil {
        logger.Error("连接关闭失败")
        return
    } else {
        logger.Info("连接关闭成功")
    }
}

效果

PS D:\DATA\git\GoLang\Demos\go-mysql> go run .\mysql.go
root:1@tcp(127.0.0.1:3306)/liumou?charset=utf8
[2023-01-07 11:08:18] [INFO] [mysql.go:55] 数据插入成功,ID:  0
[2023-01-07 11:08:18] [INFO] [mysql.go:55] 数据插入成功,ID:  0
[2023-01-07 11:08:18] [INFO] [mysql.go:55] 数据插入成功,ID:  0
[2023-01-07 11:08:18] [INFO] [mysql.go:67] 更新成功,影响的行数:  0
[2023-01-07 11:08:18] [INFO] [mysql.go:78] 删除成功,影响的行数:  1
[2023-01-07 11:08:18] [EROR] [mysql.go:91] 连接已断开,正在重新连接
root:1@tcp(127.0.0.1:3306)/liumou?charset=utf8                    
[2023-01-07 11:08:18] [INFO] [mysql.go:100] 查询成功,数据如下     
[{1 刘亦菲 1} {3 刘德华 18} {4 刘德华 18}]                        
[2023-01-07 11:08:18] [INFO] [mysql.go:115] 连接关闭成功        
PS D:\DATA\git\GoLang\Demos\go-mysql> 

附-数据表创建语句

CREATE TABLE `demo` (
    `id` INT(11) NULL DEFAULT NULL,
    `name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
    `work` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci'
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB;