首页 > 数据库 >go 通过sql操作mysql

go 通过sql操作mysql

时间:2022-08-15 21:15:48浏览次数:74  
标签:Printf name err fmt mysql db sql go id

GoLang学习更方便,一文在手,面试我有
GoLang面试 | GoLang面试 | GoLang面试


go 通过sql操作mysql

亲测、2022/08/15 20:53 北京朝阳

@

目录

前言

表格

在这里插入图片描述

结果

在这里插入图片描述

go代码

package main

import (
	"database/sql"
	"fmt"
	"time"

	_ "github.com/go-sql-driver/mysql"
)

var db *sql.DB   //全局变量client

func initMySQL() (err error) {
	dsn := "root:123456@tcp(127.0.0.1:3306)/test"
	db, err = sql.Open("mysql", dsn)
	if err != nil {
		panic(err)
	}
	err = db.Ping() //检测是否连接成功
	if err != nil {
		return
	}
	db.SetMaxOpenConns(200)                 //最大连接数
	db.SetMaxIdleConns(10)                  //连接池里最大空闲连接数。必须要比maxOpenConns小
	db.SetConnMaxLifetime(time.Second * 10) //最大存活保持时间
	db.SetConnMaxIdleTime(time.Second * 10) //最大空闲保持时间
	return
}

func main() {
	if err := initMySQL(); err != nil {
		fmt.Printf("connect to db failed,err:%v\n", err)
	} else {
		fmt.Println("connect to db success")
	}

	sqlStr := "SELECT id, name FROM sys_user WHERE id=?"
	var u user
	//非常重要:确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放
	err := db.QueryRow(sqlStr, 1).Scan(&u.id, &u.name)
	if err != nil {
		fmt.Printf("scan failed, err: %v\n", err)
		return
	}
	fmt.Printf("id:%d,name:%s,age:%d\n", u.id, u.name)

	defer db.Close()

}

//user结构体
type user struct {
	id int
	name string
}

sql

database: test

CREATE TABLE `sys_user` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


汇总-增删改查

结果:

在这里插入图片描述

package main

import (
	"database/sql"
	"fmt"
	"time"

	_ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

func initMySQL() (err error) {
	dsn := "root:1234qwer@tcp(bj-cdb-mw08tjgs.sql.tencentcdb.com:60042)/test"
	db, err = sql.Open("mysql", dsn)
	if err != nil {
		panic(err)
	}
	err = db.Ping()
	if err != nil {
		return
	}
	db.SetMaxOpenConns(200)                 //最大连接数
	db.SetMaxIdleConns(10)                  //连接池里最大空闲连接数。必须要比maxOpenConns小
	db.SetConnMaxLifetime(time.Second * 10) //最大存活保持时间
	db.SetConnMaxIdleTime(time.Second * 10) //最大空闲保持时间
	return
}

func main() {
	if err := initMySQL(); err != nil {
		fmt.Printf("connect to db failed,err:%v\n", err)
	} else {
		fmt.Println("connect to db success")
	}
	select_one()
	queryMultiRowDemo()
	insertRowDemo()
	updateRowDemo()
	deleteRowDemo()
	defer db.Close()

}

type user struct {
	id int
	// age  int
	name string
}

//查询
func select_one() {
	sqlStr := "SELECT id, name FROM sys_user WHERE id=?"
	var u user
	//非常重要:确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放
	err := db.QueryRow(sqlStr, 1).Scan(&u.id, &u.name)
	if err != nil {
		fmt.Printf("scan failed, err: %v\n", err)
		return
	}
	fmt.Printf("id:%d,name:%s\n", u.id, u.name)
}

// 查询多条数据示例
func queryMultiRowDemo() {
	sqlStr := "SELECT id,name FROM sys_user WHERE id>?"
	var u user
	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() {
		err := rows.Scan(&u.id, &u.name)
		if err != nil {
			fmt.Printf("scan failed, err: %v\n", err)
			return
		}
		fmt.Printf("id:%d,name:%s\n", u.id, u.name)
	}
}

//插入数据
func insertRowDemo() {
	sqlStr := "INSERT INTO sys_user(id,name) VALUES(?,?)"
	ret, err := db.Exec(sqlStr, 23, "javapub")
	if err != nil {
		fmt.Printf("insert failed, err:%v\n", err)
		return
	}
	var theID int64
	theID, err = ret.LastInsertId()
	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 updateRowDemo() {
	sqlStr := "UPDATE sys_user SET name=? WHERE id=?"
	ret, err := db.Exec(sqlStr, "i love javapub", 23)
	if err != nil {
		fmt.Printf("updated failed,err:%v\n", err)
		return
	}
	var n int64
	n, err = ret.RowsAffected()
	if err != nil {
		fmt.Printf("get rowsAffected failed,err:%v\b", err)
		return
	}
	fmt.Printf("updated success, the rows affected is %d\n", n)
}

//删除数据
func deleteRowDemo() {
	sqlStr := "DELETE FROM sys_user WHERE id=?"
	ret, err := db.Exec(sqlStr, 1)
	if err != nil {
		fmt.Printf("delete failed,err:%v\n", err)
		return
	}
	var n int64
	n, err = ret.RowsAffected()
	if err != nil {
		fmt.Printf("get RowsAffected failed, err:%v\n", err)
		return
	}
	fmt.Printf("delete success, affected rows:%d\n", n)
}


回复 golang,获取学习路线思维导图、加入GO计划学习

标签:Printf,name,err,fmt,mysql,db,sql,go,id
From: https://www.cnblogs.com/JavaPub/p/16589615.html

相关文章

  • 【2022-08-15】mysql基础知识(二)
    mysql基础知识(二)字符编码与配置文件windows系统下查看mysql的版本信息:\s由于5.6版本编码不统一,会导致乱码的情况出现,所以统一修改编码格式为>>>:utf8my-defaul......
  • keras.utils.to_categorical方法
    用法:to_categorical(y,num_classes=None,dtype='float32')将整型的类别标签转为onehot编码。y为int数组,num_classes为标签类别总数,大于max(y)(标签从0开始的)。返回:如果n......
  • Spark SQL内核剖析 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1pxYliwHYdnd6EOHtzyQsWg点击这里获取提取码。 ......
  • golang之Redis
    Redis是一个基于内存的非关系型数据库,在项目开发中使用非常广泛,Go语言操作Redis需要使用三方包,我们选择支持Redis集群和Redis哨兵的go-redis包来讲述Go语言如......
  • mysql 免密登录(解决报错ERROR 1045 (28000))
    mysql登录时,ERROR1045(28000):错误解决办法通常出现的报错如下:ERROR1045(28000):Accessdeniedforuser'ODBC'@'localhost'(usingpassword:NO)ERROR1045(2......
  • MySQL2
    目录一、字符编码与配置文件1.配置文件2.添加字符编码相关的配置(百度查看就好)二、存储引擎1.简介2.需掌握的存储引擎3.不同存储引擎之间底层文件的区别3.1.InnoDB3.2.MyISA......
  • golang之jwt的token登录
    什么是JSONWebToken?JSONWebToken(JWT)是一个开放标准(RFC7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON方式安全地传输信息。由于此信息是经过数字签名的......
  • python连接mysql与redis(ssh方式)
    python如何连接数据库(SSH方式)性能测试时,有个支付订单的场景,需要用到已生成的订单code,如何获取订单code?一,通过Jmeter连接数据库获取。二,直接mysql导出数据我这里是使用......
  • MySQL的字段语法
    MySQL的存储字符编码与配置文件1.\s#查看数据库基本信息(用户、字符编码)2.my-default.ini#windows下MySQL默认的配置文件拷贝上述文件并重命名为my.ini3.添......
  • MySQL的存储引擎
    MySQL的存储引擎存储引擎介绍文件系统操作系统组织和存取数据的一种机制文件系统是一种软件文件系统不管使用什么文件系统,数据内容不会变化不同的是,存储空间......