go操作mysql
数据库连接:
使用database/sql包时必须注入(至少)一个数据库驱动。
go get github.com/go-sql-driver/mysql
导入包:
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
通过Init函数连接数据库
db, dbErr = sql.Open("mysql", "root:root123456@tcp(127.0.0.1:3306)/yangtest?charset=utf8")
db.SetMaxOpenConns(200) //设置最大连接数
db.SetMaxIdleConns(20) //设置闲时最大连接数
db.Close() //关闭数据库连接
连接数据库示例:
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"log"
)
var db *sql.DB
var dbErr error
// init 只执行一次
func init(){
db, dbErr =
sql.Open("mysql", "root:root123456@tcp(127.0.0.1:3306)/yangtest?charset=utf8")
if dbErr != nil {
log.Fatal("dbErr:", dbErr.Error())
}
if dbErr = db.Ping(); dbErr != nil {
log.Fatal("连接失败", dbErr.Error())
}
fmt.Println("连接数据库成功...")
db.SetMaxOpenConns(200) //设置最大连接数
db.SetMaxIdleConns(20) //设置闲时最大连接数
}
func main() {
db.Close() //关闭数据库连接
}
插入数据:
res, err := db.Exec("INSERT INTO users(username,email) VALUES(?,?)", "lampol", "1234@qq.com")
id, _ := res.LastInsertId() //获取插入id
row, _ := res.RowsAffected() //获取影响行数
数据表:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(100) DEFAULT NULL,
`email` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入数据示例:
// 插入数据
func insertData() {
//数据库插入方式1:
res, err := db.Exec("INSERT INTO users(username,email) VALUES(?,?)", "lampol", "1234@qq.com")
if err != nil {
log.Fatal("err:", err)
}
id, _ := res.LastInsertId() //插入id
row, _ := res.RowsAffected() //影响行数
fmt.Println(id, row)
//数据库插入方式2:
pre, err := db.Prepare("INSERT INTO users(username,email) VALUES(?,?)")
res1, err := pre.Exec("yangphp", "33333@qq.com")
if err != nil {
log.Fatal("err:", err)
}
id1, _ := res1.LastInsertId() //插入id
row1, _ := res1.RowsAffected() //影响行数
fmt.Println(id1, row1)
}
查询多条数据
rows, err := db.Query("SELECT * FROM users ") 查询数据
rows.Next() 获取下一条数据
rows.Scan() 读取数据中的值
查询数据实例:查询多条
type User struct {
Id int `json:id`
UserName string `json:username`
Email string `string:email`
}
// 查询数据
func queryAll() {
var user User
rows, err := db.Query("SELECT * FROM users ")
if err != nil {
log.Fatal("err:", err)
}
//遍历数据
var users = make([]User, 0)
for rows.Next() {
rows.Scan(&user.Id, &user.UserName, &user.Email)
users = append(users, user)
}
fmt.Println(users) //打印所有数据
fmt.Println(users[1].UserName) //获取某个字段
}
输出:
[{1 lampol 1234@qq.com} {2 yangphp 33333@qq.com}]
yangphp
查询单条
row := db.QueryRow("SELECT * FROM users WHERE id = ? ", id) //查询单条
row.Scan(&user.Id, &user.UserName, &user.Email) //读取数据到变量
查询数据实例:查询单条
func queryOne(id int) {
var user User
row := db.QueryRow("SELECT * FROM users WHERE id = ? ", id)
err := row.Scan(&user.Id, &user.UserName, &user.Email)
if err != nil {
log.Fatal("err:", err)
}
fmt.Println(user)
fmt.Println(user.UserName)
}
调用后输出:
{2 yangphp 33333@qq.com}
yangphp
更新数据:
func updateData(id int) {
res, err := db.Exec("UPDATE users SET username = ? WHERE id = ?", "liming", id)
if err != nil {
log.Fatal(err)
}
num, _ := res.RowsAffected()
fmt.Println(num) //打印出影响行数
}
删除数据:
func deleteData(id int) {
ret, err := db.Exec("DELETE FROM users WHERE id = ?", id)
if err != nil {
log.Fatal(err)
}
num, _ := ret.RowsAffected()
fmt.Println(num) //打印出影响行数
}
mysql事务:
show create table user; 查看表引擎,必须innodb 才可以
alter table user engine=innodb 修改表引擎
func (db *DB) Begin() (*Tx, error) Begin开始一个事务
func (tx *Tx) Rollback() error 回滚事务
func (tx *Tx) Commit() error 提交事务
事务处理示例:
// 事务处理
func transData() {
trans, _ := db.Begin()
res, _ := trans.Exec("INSERT INTO users(username,email) VALUES(?,?) ", "liudehua222", "45645@qq.com")
addNum, _ := res.RowsAffected()
ret, _ := trans.Exec("DELETE FROM users WHERE id = ?", 10)
delNum, _ := ret.RowsAffected()
fmt.Println(addNum, delNum)
if addNum == 1 && delNum == 1 {
trans.Commit()
fmt.Println("执行事务成功")
} else {
trans.Rollback()
fmt.Println("执行事务失败")
}
}
由于没有id为10的记录,所以执行失败了

完结
但行好事,莫问前程!
本文来自博客园,作者:yangphp,转载请注明原文链接:https://www.cnblogs.com/ypeih/p/17299428.html

浙公网安备 33010602011771号