Go连接mysql数据库,以及简单实现增删改查

本文介绍如何使用Go语言连接MySQL数据库,并通过示例代码演示增删改查等基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:在看本章之前,需要安装了Mysql,同时也要Go的环境,这里我已经默认你都配置好了。

目录

 

安装依赖

Go连接Mysql示例

Go语言实现Mysql增删改查

增样例代码:

删样例代码:

改样例代码:

查样例代码:


安装依赖

Go语言官方没有实现Mysql的数据库驱动,database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的数据库驱动。本文章实用的数据库驱动是Go Mysql Driver。

安装依赖code

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

Go连接Mysql示例

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql" //导入包但不使用,init()
)

//Go连接Mysql示例
func main() {
	//数据库
	//用户名:密码啊@tcp(ip:端口)/数据库的名字
	dsn := "root:123@tcp(127.0.0.1:3306)/test"
	//连接数据集
	db, err := sql.Open("mysql", dsn) //open不会检验用户名和密码
	if err != nil {
		fmt.Printf("dsn:%s invalid,err:%v\n", dsn, err)
		return
	}
	err = db.Ping() //尝试连接数据库
	if err != nil {
		fmt.Printf("open %s faild,err:%v\n", dsn, err)
		return
	}
	fmt.Println("连接数据库成功~")

}

运行后成功后会如下显示:

 出现上面的图显示的连接数据库成功,就没问题~接下来对示例代码解析一下。

import 一次性导入三个包,其中 "database/sql"是操作sql数据库的官方接口。 _ "github.com/go-sql-driver/mysql"表示导入安装的依赖,Mysql数据库驱动,,前面加一个下划线,表示导入包但是不使用,相当于init()初始化

dsn:连接Mysql的信息,格式是用户名:密码啊@tcp(ip:端口)/数据库的名字,例如:

dsn := "root:123@tcp(127.0.0.1:3306)/test"

用户:root,密码:123   ,连接Mysql 的IP地址:127.0.0.1 ,端口:3306  ,连接数据库的名字:test

 

Go语言实现Mysql增删改查

建表:实现增删改查,首先Mysq中得创建一个数据库,再得创建一个表。建表实例代码如下:

CREATE TABLE `user`(
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `name`  VARCHAR(20) DEFAULT '',
    `age`   INT(11) DEFAULT '0',
    PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

Mysql创建一个user表,里面有三个字段,id,那么,age,其中id作为主键,引擎是InnoDB。建表成功后如下

增样例代码:

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql" //导入包但不使用,init()
)

var db *sql.DB //连接池对象
func initDB() (err error) {
	//数据库
	//用户名:密码啊@tcp(ip:端口)/数据库的名字
	dsn := "root:123@tcp(127.0.0.1:3306)/test"
	//连接数据集
	db, err = sql.Open("mysql", dsn) //open不会检验用户名和密码
	if err != nil {
		return
	}
	err = db.Ping() //尝试连接数据库
	if err != nil {
		return
	}
	fmt.Println("连接数据库成功~")
	//设置数据库连接池的最大连接数
	db.SetMaxIdleConns(10)
	return
}


func insert() {
	sqlStr := `insert into user(name,age) values("加油呀",28)`//sql语句
	ret, err := db.Exec(sqlStr)//执行sql语句
	if err != nil {
		fmt.Printf("insert failed,err:%v\n", err)
		return
	}
	//如果是插入数据的操作,能够拿到插入数据的id
	id, err := ret.LastInsertId()
	if err != nil {
		fmt.Printf("get id failed,err:%v\n", err)
		return
	}
	fmt.Println("id", id)
}


//Go连接Mysql示例
func main() {
	err := initDB()
	if err != nil {
		fmt.Printf("init DB failed,err%v\n", err)
	}

	//插入数据
	insert()
}

删样例代码:

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql" //导入包但不使用,init()
)

var db *sql.DB //连接池对象
func initDB() (err error) {
	//数据库
	//用户名:密码啊@tcp(ip:端口)/数据库的名字
	dsn := "root:123@tcp(127.0.0.1:3306)/test"
	//连接数据集
	db, err = sql.Open("mysql", dsn) //open不会检验用户名和密码
	if err != nil {
		return
	}
	err = db.Ping() //尝试连接数据库
	if err != nil {
		return
	}
	fmt.Println("连接数据库成功~")
	//设置数据库连接池的最大连接数
	db.SetMaxIdleConns(10)
	return
}
func deleteRow(id int) {
	sqlStr := `delete from user where id=?`
	ret, err := db.Exec(sqlStr, id)
	if err != nil {
		fmt.Printf("delete faild,err:%v\n", err)
		return
	}
	n, _ := ret.RowsAffected()
	fmt.Printf("删除了%d行数据\n", n)

}

//Go连接Mysql示例
func main() {
	err := initDB()
	if err != nil {
		fmt.Printf("init DB failed,err%v\n", err)
	}
	//删除数据
	deleteRow(1)
}

改样例代码:

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql" //导入包但不使用,init()
)

var db *sql.DB //连接池对象
func initDB() (err error) {
	//数据库
	//用户名:密码啊@tcp(ip:端口)/数据库的名字
	dsn := "root:123@tcp(127.0.0.1:3306)/test"
	//连接数据集
	db, err = sql.Open("mysql", dsn) //open不会检验用户名和密码
	if err != nil {
		return
	}
	err = db.Ping() //尝试连接数据库
	if err != nil {
		return
	}
	fmt.Println("连接数据库成功~")
	//设置数据库连接池的最大连接数
	db.SetMaxIdleConns(10)
	return
}

func updateRow(newAge int, id int) {
	sqlStr := `update user set age=? where id=?`
	ret, err := db.Exec(sqlStr, newAge, id)
	if err != nil {
		fmt.Printf("update failed ,err:%v\n", err)
		return
	}
	n, _ := ret.RowsAffected()
	fmt.Printf("更新了%d行数据\n", n)
}

//Go连接Mysql示例
func main() {
	err := initDB()
	if err != nil {
		fmt.Printf("init DB failed,err%v\n", err)
	}

	//更新数据
	updateRow(20, 1)

}

查样例代码:

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql" //导入包但不使用,init()
)

type user struct {
	id   int
	name string
	age  int
}

var db *sql.DB //连接池对象
func initDB() (err error) {
	//数据库
	//用户名:密码啊@tcp(ip:端口)/数据库的名字
	dsn := "root:123@tcp(127.0.0.1:3306)/test"
	//连接数据集
	db, err = sql.Open("mysql", dsn) //open不会检验用户名和密码
	if err != nil {
		return
	}
	err = db.Ping() //尝试连接数据库
	if err != nil {
		return
	}
	fmt.Println("连接数据库成功~")
	//设置数据库连接池的最大连接数
	db.SetMaxIdleConns(10)
	return
}
func query(id int) {
	//1.查询单挑记录的sql语句  ?是参数
	sqlStr := "select id,name,age from user where id=?;"
	//2.执行
	rowObj := db.QueryRow(sqlStr, id) //从连接池里取一个连接出来去数据库查询单挑记录
	//3.拿到结果
	var u1 user
	rowObj.Scan(&u1.id, &u1.name, &u1.age)
	//打印结果
	fmt.Printf("u1:%#v\n", u1)
}

func queryMore(n int) {
	//1.sql语句
	sqlStr := "select id,name,age from user where id >?;"
	//2.执行
	rows, err := db.Query(sqlStr, n)
	if err != nil {
		fmt.Printf("%s query failed,err:%v\n", sqlStr, err)
		return
	}
	//3一定要关闭rows
	defer rows.Close()
	//4.循环取值
	for rows.Next() {
		var u1 user
		rows.Scan(&u1.id, &u1.name, &u1.age)
		fmt.Printf("u1:%#v\n", u1)
	}
}

//Go连接Mysql示例
func main() {
	err := initDB()
	if err != nil {
		fmt.Printf("init DB failed,err%v\n", err)
	}
	//查询单行
	query(3)
	//查询多行
	queryMore(0)
}

 

 

 

 

 

 

 

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落凡尘.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值