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