随心的博客

好记性不如个烂笔头,随心记录!

返回顶部

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("执行事务失败")
	}
}

 

由于没有id10的记录,所以执行失败了

 

 

 

完结

 

posted @ 2023-04-08 22:27  yangphp  阅读(42)  评论(0编辑  收藏  举报