Go-MySQL-Driver,让Go语言拥抱MySQL

举报
海风极客 发表于 2022/10/16 19:11:04 2022/10/16
【摘要】 开源地址:https://github.com/go-sql-driver/mysql 1 简介正如官方所说,Go-MySQL-Driver是一个Go的sql或数据库操作包。 2 优势纯粹的Go语言实现,轻量级和快速z支持TCP/IPv4, TCP/IPv6, Unix域套接字或自定义协议自动处理断开的连接,自动连接池(通过数据库/sql包)支持大于16MB的查询完整的sql体系,智能长数据...

开源地址:https://github.com/go-sql-driver/mysql

1 简介

在这里插入图片描述
正如官方所说,Go-MySQL-Driver是一个Go的sql或数据库操作包。

2 优势

  • 纯粹的Go语言实现,轻量级和快速
  • z支持TCP/IPv4, TCP/IPv6, Unix域套接字或自定义协议
  • 自动处理断开的连接,自动连接池(通过数据库/sql包)
  • 支持大于16MB的查询
  • 完整的sql体系,智能长数据处理

3 上手操作

3.1 建表

CREATE TABLE `student` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

3.2 新建Go Modoules并下载Go-MySQL-Driver依赖

在项目根目录下执行:

go get -u github.com/go-sql-driver/mysql

3.3 代码

package main

import (
   "database/sql"
   "fmt"
   _ "github.com/go-sql-driver/mysql" 
   "time"
)

var my_db *sql.DB     //数据库
var my_tb = "student" //表名

/**
实体类
*/
type Student struct {
   Id   int    
   Name string 
   Age  int
}

/**
数据库连接初始化
*/
func init() {
   var err error
   my_db, err = sql.Open("mysql", "root:12345678@tcp(127.0.0.1:3306)/test")
   my_db.SetConnMaxLifetime(100 * time.Second) // 超时时间
   my_db.SetMaxOpenConns(0)                    // 设置最大打开的连接数,默认值为0表示不限制。
   my_db.SetMaxIdleConns(16)                   // 设置闲置的连接数
   if err != nil {
      fmt.Println("连接失败")
   }
   fmt.Println("连接成功") // 检查是否连接成功数据库
}

/**
查看全部
*/
func FindAllStudent() []Student {
   var students []Student
   var stu Student
   rows, err := my_db.Query("SELECT * FROM " + my_tb)
   if err != nil {
      return nil
   }
   for rows.Next() {
      err := rows.Scan(&stu.Id, &stu.Name, &stu.Age)
      if err != nil {
         return nil
      }
      students = append(students, stu)
   }
   return students
}

/**
添加一个
*/
func SaveAdminPwd(stu Student) bool {
   tx, err := my_db.Begin()
   if err != nil {
      return false
   }
   stmt, err := tx.Prepare("INSERT INTO " + my_tb + "(id,name,age) VALUES (?,?,?)")
   if err != nil {
      return false
   }
   result, err := stmt.Exec(stu.Id, stu.Name, stu.Age)
   tx.Commit()
   if err != nil {
      return false
   }
   println(result)
   return true
}

/**
删除一个根据id
*/
func DeleteStudentById(id int) bool {
   tx, err := my_db.Begin()
   if err != nil {
      return false
   }
   stmt, err := tx.Prepare("DELETE  FROM " + my_tb + " WHERE id=?")
   if err != nil {
      return false
   }
   result, err := stmt.Exec(id)
   if err != nil {
      return false
   }
   tx.Commit() //别忘
   println(result)
   return true
}

/**
查看一个是否存在
*/
func GetStudentById(id int) Student {
   var stu Student
   stmt, err := my_db.Prepare("SELECT * FROM " + my_tb + " WHERE id=?")
   rows, err := stmt.Query(id)
   if err != nil {
      return Student{}
   }
   if rows.Next() {
      err := rows.Scan(&stu.Id, &stu.Name,&stu.Age)
      if err != nil {
         return Student{}
      }
   }
   return stu
}

/**
修改一个
*/
func UpdateStudentById(stu Student) bool {
   prepare, err := my_db.Prepare("UPDATE " + my_tb + " SET name=?,age=? WHERE id=?")
   if err != nil {
      return false
   }
   exec, err := prepare.Exec(stu.Name, stu.Age, stu.Id)
   if err != nil {
      return false
   }
   print(exec)
   return true
}

/**
使用main函数测试
*/
func main() {
   stu := Student{3, "ww", 32}
   SaveAdminPwd(stu)
   //DeleteStudentById(2)
   studentById := GetStudentById(3)
   fmt.Println(studentById)
   UpdateStudentById(Student{3,"zsss",21})
   s := GetStudentById(3)
   fmt.Println(s)
   students := FindAllStudent()
   for _, stu := range students {
      fmt.Println(stu)
   }
}

~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。