安装mysql驱动:

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

初始化模块

go mod init m

执行
go mod tidy

导入包:

package main

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

获得链接:

package main

import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"time"
) func main() {
db, err := sql.Open("mysql", "root:123456@/go_db")
if err != nil {
panic(err)
}
print(db)
// 最大连接时长
db.SetConnMaxLifetime(time.Minute * 3)
// 最大连接数
db.SetMaxOpenConns(10)
// 空闲连接数
db.SetMaxIdleConns(10)
}

初始化连接

Open函数可能只是验证其参数格式是否正确,实际上并不创建与数据库的连接。如果要检查数据源的名称是否真实有效,应该调用Ping方法。

返回的DB对象可以安全地被多个goroutine并发使用,并且维护其自己的空闲连接池。因此,Open函数应该仅被调用一次,很少需要关闭这个DB对象。

package main

import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
) // 定义一个全局对象db
var db2 *sql.DB // 定义一个初始化数据库的函数
func initDB() (err error) {
dsn := "root:123456@tcp(127.0.0.1:3306)/go_db?charset=utf8mb4&parseTime=True"
// 不会校验账号密码是否正确
// 注意!!!这里不要使用:=,我们是给全局变量赋值,然后在main函数中使用全局变量db
db2, err = sql.Open("mysql", dsn)
if err != nil {
return err
}
// 尝试与数据库建立连接(校验dsn是否正确)
err = db2.Ping()
if err != nil {
return err
}
return nil
} func main() {
err := initDB() // 调用输出化数据库的函数
if err != nil {
fmt.Printf("初始化失败!,err:%v\n", err)
return
}else{
fmt.Printf("初始化成功")
}
}

当行查询:

单行查询db.QueryRow()执行一次查询,并期望返回最多一行结果(即Row)。QueryRow总是返回非nil的值,直到返回值的Scan方法被调用时,才会返回被延迟的错误。

定义结构体:

type user struct {
id int
username string
password string
}
// 查询一条用户数据
func queryRowDemo() {
sqlStr := "select id, username, password from user_tbl where id=?"
var u user
// 确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放
err := db.QueryRow(sqlStr, 1).Scan(&u.id, &u.username, &u.password)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("id:%d name:%s age:%s\n", u.id, u.username, u.password)
}
func main() {
err := initDB() // 调用输出化数据库的函数
if err != nil {
fmt.Printf("初始化失败!,err:%v\n", err)
return
}else{
fmt.Printf("初始化成功")
}
queryRowDemo()
}

查询多行

多行查询db.Query()执行一次查询,返回多行结果(即Rows),一般用于执行select命令。参数args表示query中的占位参数。

// 查询多条数据示例
func queryMultiRow() {
sqlStr := "select id, username, password from user_tbl where id > ?"
rows, err := db.Query(sqlStr, 0)
if err != nil {
fmt.Printf("query failed, err:%v\n", err)
return
}
// 非常重要:关闭rows释放持有的数据库链接
defer rows.Close() // 循环读取结果集中的数据
for rows.Next() {
var u user
err := rows.Scan(&u.id, &u.username, &u.password)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("id:%d username:%s password:%s\n", u.id, u.username, u.password)
}
}

插入,更新和删除操作都使用Exec方法

func (db *DB) Exec(query string, args ...interface{}) (Result, error)
新增:
// 插入数据
func insertData() {
sqlStr := "insert into user_tbl(username,password) values (?,?)"
ret, err := db.Exec(sqlStr, "张三", "zs123")
if err != nil {
fmt.Printf("insert failed, err:%v\n", err)
return
}
theID, err := ret.LastInsertId() // 新插入数据的id
if err != nil {
fmt.Printf("get lastinsert ID failed, err:%v\n", err)
return
}
fmt.Printf("insert success, the id is %d.\n", theID)
} 删除:
func delData() {
sql := "delete from user_tbl where id =?"
ret, err := db.Exec(sql, "1")
if err != nil {
fmt.Printf("删除失败, err:%v\n", err)
return
}
rows, err := ret.RowsAffected()
if err != nil {
fmt.Printf("删除行失败, err:%v\n", err)
return
}
fmt.Printf("删除成功, 删除的行数:%d.\n", rows)
} 更新:
func updateData() {
sql := "update user_tbl set username=?, password=? where id=?"
ret, err := db.Exec(sql, "kite2", "kite123", "2")
if err != nil {
fmt.Printf("更新失败, err:%v\n", err)
return
}
rows, err := ret.RowsAffected()
if err != nil {
fmt.Printf("更新行失败, err:%v\n", err)
return
}
fmt.Printf("更新成功, 更新的行数:%d.\n", rows)
}

注意点:

1.表名不能作为占位符使用

"DELETE FROM `?` WHERE created_date BETWEEN ? AND ?" 

ret, err := db3.Exec(sql, tableName, startDate, endDate)

2.dsn中用户名和密码 如果包含特殊字符:!@#^*等,需要进行urlencode处理

url.QueryEscape

Go操作数据库之MySQL的更多相关文章

  1. Python操作数据库之 MySQL

    Python操作数据库之MySQL 一.安装Python-MySQLdb模块 Python-MySQLdb是一个操作数据库的模块,Python 通过它对 mysql 数据实现各种操作. 如果要源码安装 ...

  2. go操作数据库 Go-SQL-Driver/MySQL 使用详解

    go操作mysql的驱动包很多,这里讲解当下比较流行的Go-SQL-Driver/MySQL1.下载安装 执行下面两个命令: 下载:go get github.com/Go-SQL-Driver/My ...

  3. MySQL操作数据库--与MySQL零距离接触1-7

    第一章 1-7操作数据库 数据库是一个集合:表 索引等. MySQL语句规范: 关键字与函数名称全部大写 数据库名称.表名称.字段名称全部小写 SQL语句必须以分号结尾 语法结构:       {}: ...

  4. python操作数据库(Mysql)

    原文地址:https://www.cnblogs.com/R-bear/p/7022231.html python DB-API介绍 1.python标准数据库接口为 python DB-API,py ...

  5. Python教程:操作数据库,MySql的安装详解

    各位志同道合的同仁请点击上方关注 本教程是基于Python语言的深入学习.本次主要介绍MySql数据库软件的安装.不限制语言语法,对MySql数据库安装有疑惑的各位同仁都可以查看一下. 如想查看学习P ...

  6. thinkphp中的内置操作数据库与mysql中的函数汇总

    8.4.4 Model类getModelName() 获取当前Model的名称getTableName() 获取当前Model的数据表名称switchModel(type,vars=array()) ...

  7. MySQL操作数据库值mysql事务

    创建一个无参数的事务     注意要写START TRANSACTION或者是Begin;Mysql会默认直接执行一个单元 MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可 ...

  8. 数据库 之MySQL 简单教程

      So Easy系列之MySQL数据库教程 1.   数据库概述 1.1.  数据库概述 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和 ...

  9. 一次莽撞的行为:在phpmyadmin中修改MySQL root密码后无法操作数据库

    一.手贱行为(✿◡‿◡) 在一次开发中通过xampp方式安装了PHP环境,需要操作数据库时通过phpmyadmin访问MySQL,在一次数据库操作时想起没有设置密码,于是直接在mysql数据库中的us ...

  10. MySQL操作数据库和表的常用命令新手教程

    1.查看数据库 获取服务器上的数据库列表通常很有用.执行show databases;命令就可以搞定. mysql> show databases; 2.创建数据库 mysql> crea ...

随机推荐

  1. 全网最适合入门的面向对象编程教程:45 Python 实现常见数据结构-链表、树、哈希表、图和堆

    全网最适合入门的面向对象编程教程:45 Python 实现常见数据结构-链表.树.哈希表.图和堆 摘要: 数据结构是计算机科学中的一种组织和存储数据的方式,它决定了数据的访问方式和操作效率,数据结构的 ...

  2. pyspark 数据类型及转换

    spark 有哪些数据类型 https://spark.apache.org/docs/latest/sql-reference.html Spark 数据类型 Data Types Spark SQ ...

  3. [python][selenium] Web UI自动化8种页面元素定位方式

    关联文章:Web UI自动化页面切换iframe框架 简单的加个前置知识: 第一:webdriver.Chrome()这句话,通过WebDriver的构造方法,拿到浏览器驱动的对象,然后通过这个对象, ...

  4. 工具 – Vitest 与单元测试

    前言 Vitest 是一款配搭 Vite 的前端单元测试工具,可以用于取代 Jasmine 和 Jest. 我先聊一下测试,每当添加新代码或修改旧代码后,我们多少都得测试一下,以确保功能正确才能交付. ...

  5. 大模型应用开发初探 : 通用函数调用Planner

    大家好,我是Edison. 上一篇,我们了解了什么是AI Agent以及如何用Semantic Kernel手搓一个AI Agent.有朋友留言说,自动函数调用对大模型有较高的要求,比如Azure O ...

  6. 配置windows update失败还原更改

    配置windows update失败还原更改_解决方案 解决方法: 方法1:     重启,按F8,选择最后一次正常启动.     如果还是需要等待.可采用方法2: 方法2:     重启,按F8,选 ...

  7. 【赵渝强老师】Redis案例分析:用setbit统计活跃用户

    一.需求背景 首先,我们来看一下需求:网站统计用户登录的次数,具体如下: 网站有1亿个用户,有经常登录的,也有不经常登录的 如何来记录用户的登录信息 如何查询活跃用户:比如:一周内,登录3次的 二.使 ...

  8. python:批量删除指定文件目录中多个文件

    #coding:utf-8# 任务需要,需要删除多余的文件,手动删除太麻烦,几行python搞定 import os from glob import glob path = r"/medi ...

  9. Guava中的Joiner和Splitter

    目录 Guava 介绍 Joiner list转string map转string 处理嵌套集合 处理null值 Splitter string转list string转map 多个拆分符 输出 代码 ...

  10. iOS键盘通知弹框使用小结

    项目开发中文本框输入的时候经常会用到键盘弹框遮挡的问题.解决办法就是根据底部键盘弹出的高度动态的改变对应view的位置.这里以多行文本框输入为例,效果图如下. //第一步,注册监听键盘通知 [[NSN ...