GO连接数据库
Go连接数据库
1 MySQL
1.1 准备
1.1.1 下载包
go get -u github.com/go-sql-driver/mysql
1.1.2 使用
import "database/sql"
import _ "github.com/go-sql-driver/mysql"
db, err := sql.Open("mysql", "user:password@/dbname")
1.1.3 数据源连接名
username:password@protocol(address)/dbname?param=value
1.1.4 实战连接
package main
import (
"database/sql"
"fmt"
// 记得一定要导这个包
_ "github.com/go-sql-driver/mysql"
)
func main() {
driverName := "root:123456@tcp(127.0.0.1:3306)/mybatis-plus?charset=utf8"
db, er := sql.Open("mysql", driverName)
if er != nil {
fmt.Println(er)
fmt.Print("连接错误")
return
}
fmt.Print("连接到数据库... ")
db.Close()
}
记得导包:_ "github.com/go-sql-driver/mysql"
,否则会报错sql: unknown driver "mysql" (forgotten import?)
,这里导包时用的_
表示只执行包中的init
方法。
1.2 操作数据库
下面是准备的数据库表:
create table user
(
id bigint auto_increment comment '主键ID' primary key,
name varchar(30) null comment '姓名',
age int null comment '年龄',
email varchar(50) null comment '邮箱'
);
1.2.1 增
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
driverName := "root:123456@tcp(127.0.0.1:3306)/mybatis-plus?charset=utf8"
db, er := sql.Open("mysql", driverName)
if er != nil {
fmt.Println(er)
fmt.Print("连接错误")
return
}
// 关闭数据库连接
defer db.Close()
defer fmt.Println("数据库连接已关闭!")
fmt.Println("连接到数据库... ")
insert(db);
}
// 增
func insert(db *sql.DB) {
// 执行sql预编译
stmt, _ := db.Prepare("INSERT INTO `user` SET `name` = ?, `age` = ?, `email` = ?")
res, _ := stmt.Exec("小红", 18, "xiaoming@qq.com")
id, _ := res.LastInsertId()
// 关闭
defer stmt.Close()
affected, _ := res.RowsAffected()
fmt.Printf("插入的数据的id是%d,受影响的行数是%d \n ", id, affected)
}
先使用db.Prepare
预编译sql并所加stmt
,再调用stmt.Exec
执行sql,通过执行sql返回的结果获取数据!
搬入数据的返回结果是如下结构体,其中LastInsertId()
可以获取插入数据后的id
,RowsAffected()
可以获取影响的数据行数。
type Result interface {
LastInsertId() (int64, error)
RowsAffected() (int64, error)
}
1.2.2 删
func delete(db *sql.DB) {
stmt, _ := db.Prepare("delete from `user` where id = ?")
res, _ := stmt.Exec(1)
affected, _ := res.RowsAffected()
fmt.Printf("影响行数:%d", affected)
defer smt.close()
}
1.2.3 改
func update(db *sql.DB) {
smt, _ := db.Prepare("update `user` set age = 20 where `id` = ?")
res, _ := smt.Exec(1)
affected, _ := res.RowsAffected()
fmt.Printf("影响行数:%d,插入数据ID:%d", affected)
defer smt.close()
}
1.2.4 查
这里要注意的是,如果是查的所有字段,再Scan
时就要用对应的所有字段去接受,也就是说查询几个字段就必须用几个变量来接受这几个值。
func query(db *sql.DB) {
rows, _ := db.Query("select id, name, email from `user` where id = 1")
for rows.Next() {
var id int
var name string
var email string
// 取出每一条数据
err := rows.Scan(&id, &name, &email)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("id: %d\t姓名: %s\t邮箱: %s", id, name, email)
}
// 要关闭rows
defer rows.Close()
}
预编译带占位符查询:
func query1(db sql.DB) {
stmt, _ := db.Prepare("select * from `user` where id = ?")
rows, _ := stmt.Query(1)
for rows.Next() {
var id int
var name string
var email string
var age int
// 取出每一条数据
err := rows.Scan(&id, &name, &email, &age)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("id: %d\t姓名: %s\t年龄: %d\t 邮箱:%s", id, name, age, email)
}
defer stmt.close()
defer rows.close
}
1.3 事务
func tx(db *sql.DB) {
tx, _ := db.Begin()
stmt, _ := tx.Prepare("delete from `user` where id = ?")
res, _ := stmt.Exec(5)
fmt.Println(res.RowsAffected())
defer stmt.Close()
tx.Rollback()
}
首先调用db.Begin()
开启事务,并返回一个sql.Tx
对象,再通过这个对象来操作数据库,数据库操作成功后通过调用这个对象的Commit()
或者Rollback()
方法实现十五的提交或回滚。