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() //关闭数据库连接
连接数据库示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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;
插入数据示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // 插入数据 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() 读取数据中的值
查询数据实例:查询多条
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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) //读取数据到变量
查询数据实例:查询单条
1 2 3 4 5 6 7 8 9 10 11 | 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
更新数据:
1 2 3 4 5 6 7 8 | 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) //打印出影响行数 } |
删除数据:
1 2 3 4 5 6 7 8 | 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 提交事务
事务处理示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 事务处理 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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤