摘要
本博文主要是介绍go对数据库的基本的操作。这里以mysql为例子,介绍数据库的连接与断开,数据的增删改查的相关基础操作。
一、安装依赖go官方没有实现Mysql的数据库驱动,database/sql
包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的数据库驱动。本文章实用的数据库驱动是Go Mysql Driver。安装依赖code:
go get -u github.com/go-sql-driver/mysql
二、数据库的连接
package main
import (
"database/sql" //mysql的包
"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("连接数据库成功~")
}
建表:实现增删改查,首先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()
}
3.2 数据的删除
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)
}
3.3 数据的修改
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)
}
3.4 数据的查询
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)
}
四、数据库连接断开
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql" //导入包但不使用,init()
)
var db *sql.DB //连接池对象
func close(){
db.close()
}
博文参考