安装方式:打开命令行,执行go命令:
go get -u github.com/go-sql-driver/mysql
参考代码如下:
import (
"database/sql"
"fmt"
"strings"
// 安装方式: go get -u github.com/go-sql-driver/mysql
_ "github.com/go-sql-driver/mysql"
)
var (
dbhostsip = "127.0.0.1:3306"
dbusername = "root"
dbpassword = "123456"
dbname = "chat"
)
// 初始化数据库
func InitDB() (*sql.DB, error) {
//构建连接信息
dbinfo := strings.Join([]string{dbusername, ":", dbpassword, "@tcp(", dbhostsip, ")/", dbname, "?charset=utf8"}, "")
fmt.Println(dbinfo)
//打开数据库,前面是驱动名称,所以要导入:mysql驱动github.com/go-sql-driver/mysql
dbins, err := sql.Open("mysql", dbinfo)
if nil != err {
fmt.Println("Open Database Error:", err)
return nil, err
}
// 设置数据库的最大连接数
dbins.SetConnMaxLifetime(100)
// 设置数据库最大的闲置连接数
dbins.SetMaxIdleConns(10)
// 验证连接
if err = dbins.Ping(); nil != err {
fmt.Println("Open Database Fail,Error:", err)
return nil, err
}
fmt.Println("Connect Success!!!")
return dbins, nil
}
数据库的insert, delete以及update的步骤内容大致一致,差别就是sql语句的变化,步骤一般如下:
开启事务: tx, err := DB.Begin()
准备sql语句:stmt, err := tx.Prepare(“DELETE FROM nk_user WHERE id = ?”)
执行sql语句:res, err := stmt.Exec(user.Id)
提交事务: tx.Commit()
参考示例如下:
// 执行命令,可以用于插入、删除、修改操作
func ExecuteCommand(dbins *sql.DB, cmd string) (err error) {
// 开启事务
tx, err := dbins.Begin()
if nil != err {
fmt.Println("开启事务失败:", cmd, err)
return err
}
// 准备SQL语句失败
stmt, err := tx.Prepare(cmd)
if nil != err {
fmt.Println("准备SQL语句失败:", cmd, err)
return err
}
// 将参数传递到SQL语句中执行
_, err = stmt.Exec()
if nil != err {
fmt.Println("执行SQL语句失败:", cmd, err)
return err
}
// 提交事务
err = tx.Commit()
if nil != err {
fmt.Println("提交事务失败:", err)
}
return nil
}
type User struct {
userid int
name string
password string
}
// 插入数据示例
func InsertUser(dbins *sql.DB, user User) (id int64, err error) {
tx, err := dbins.Begin()
if nil != err {
fmt.Println("开启事务失败:", err)
return -1, err
}
// 准备SQL语句
stmt, err := tx.Prepare("insert into user(`userid`, `name`,`password`) values(?,?,?)")
if nil != err {
fmt.Println("Prepare Failed!")
return -1, err
}
// 将参数传递到SQL语句中执行
res, err := stmt.Exec(user.userid, user.name, user.password)
if nil != err {
fmt.Println("Exec Failed!")
return -1, err
}
// 将事务提交
tx.Commit()
id, err = res.LastInsertId()
return id, nil
}
// 删除数据示例
func DeleteUser(dbins *sql.DB, user User) (err error) {
tx, err := dbins.Begin()
if nil != err {
fmt.Println("Begin ", err)
return err
}
// 准备SQL
stmt, err := tx.Prepare("delete from user where userid = ?")
if nil != err {
fmt.Println("prepare sql cmd err:", err)
return err
}
// 设置参数以及执行SQL
res, err := stmt.Exec(user.userid)
if nil != err {
fmt.Println("exec failed!")
return err
}
// 提交事务
id, err := res.LastInsertId()
fmt.Println("LastInsertId:", id)
err = tx.Commit()
return err
}
MySQL的查询,有查询单行,有查询多行的情况,如下所示:
// 查询单行数据:编写SQL语句,利用QueryRow,并且利用Scan将查询结果赋值到对应的对象中
func SelectUserByUserId(dbins *sql.DB, id int) User {
var user User
var idx int
err := dbins.QueryRow("select * from user where userid=?", id).Scan(&idx, &user.userid, &user.name, &user.password)
if nil != err {
fmt.Println("QueryRow Error", err)
}
return user
}
// 编写sql语句,执行Query函数
// 利用Next()读取每一行返回的结果,并且利用Scan赋值到相应的对象中
// 参考代码如下
func SelectAllUser(dbins *sql.DB) ([]User, error) {
rows, err := dbins.Query("select * from user")
if nil != err {
fmt.Println("Query Error:", err)
return nil, err
}
var uers []User
for rows.Next() {
var user User
var id int
rows.Scan(&id, &user.userid, &user.name, &user.password)
uers = append(uers, user)
}
return uers, nil
}