您好,欢迎访问一九零五行业门户网

Go语言操作Mysql语言基础知识

通常情况下,我们程序员和数据库打交道是最多的。要然我们怎么会被称为码农呢。存用户信息需要数据库,存订单需要数据库,等等等等,现在真是数据驱动着发展。
但是数据库种类有很多,有mysql,oracle,sql server。
本篇就示例如何go操作mysql。
准备工作本次使用的是go mod进行包依赖管理,还不会使用的向上爬梯子,找go mod用法。
使用的库是第三方库go-sql-driver/mysql。
准备工作之连接数据库代码
func main() { var username = "root" var password = "rootroot" var ip = "127.0.0.1" var port = "3306" var data = "go_mysql_demo" var dsn = fmt.sprintf("%s:%s@tcp(%s:%s)/%s", username, password, ip, port, data) //open只会验证dsb的格式是否正确,不会验证是否连接成功,同理,密码是否正确也不知道 db, err := sql.open("mysql", dsn) if err != nil { panic(err)} //关闭连接在 err 之后,因为可能直接就打开不成功,关闭一个没有打开的连接? defer db.close() // 此时尝试连接数据库,会判断用户,密码,ip地址,端口是否正确 err = db.ping() if err != nil { fmt.println("连接数据库失败,",err) return} //设置与数据库建立连接的最大数目,一般不管 db.setmaxopenconns(100) //设置连接池中的最大闲置连接数,一般不管 db.setmaxidleconns(50)}
注意
sql.open只会验证格式是否正确,不会连接数据库。
db.close在err之后,是因为可能打开不成功,关闭一个没有打开的连接。
db.ping会连接数据库,判断用户,密码,ip地址,端口是否正确。
准备工作之创建表我们创建一个简单的用户表。
create table `userinfo` ( `id` int(11) not null auto_increment, `name` varchar(10) default null, `phone` char(11) default null, `address` varchar(64) default null, primary key (`id`)) engine=innodb default charset=utf8mb4;
准备工作之创建结构体
假设上述工作都完成了啊。
不知道有没有想过,我们查询的数据,存成啥?,字符串?map?切片?,似乎都不是太好。
只有结构体是最清晰的,最好认识的。
结构体
type userinfo struct { id int64 `json:"id"` name string `json:"name"` phone string `json:"phone"` address string `json:"address"`}
查询单条
单条查询使用queryrow方法。
代码
//查询单条sqlstr := "select id,`name`,phone,address from userinfo where id = ?;"var user userinfo/* queryrow 第二个参数可以接收多个参数,同理,sqlstr可以有多个 ?占位符 进行匹配 queryrow 之后必须调用scan方法进行数据绑定,进行数据库链接释放*/err = db.queryrow(sqlstr, 1).scan(&user.id, &user.name, &user.phone, &user.address)if err != nil { fmt.println("查询失败", err) return}fmt.println(user)
执行结果
查询多条
多行查询使用query。
代码
//查询多条sqlstr := "select id,`name`,phone,address from userinfo where id >= ?"//参数同 queryrowrows, err := db.query(sqlstr, 1)if err != nil { fmt.println("查询失败:", err) return}// 此处使用rows释放所有链接defer rows.close()//循环整理所有数据var userlist = make([]userinfo, 0, 10)for rows.next() {var user userinfoerr = rows.scan(&user.id, &user.name, &user.phone, &user.address)if err != nil { fmt.println("绑定数据失败", err) return}userlist = append(userlist, user)}fmt.println(userlist)
执行结果
插入数据
插入数据需要用到exec。
代码
//插入数据sqlstr := "insert into userinfo(name,phone,address) values(?,?,?);"result, err := db.exec(sqlstr, "吴彦祖", 555, "不知道哪的")if err != nil { fmt.println("插入失败", err) return}//受影响的行数row_affect, err := result.rowsaffected()if err != nil { fmt.println("受影响行数获取失败:", err) return}fmt.println("受影响的行数:", row_affect)lastid, err := result.lastinsertid()if err != nil { fmt.println("新增行id获取失败:", err) return}fmt.println("新增行id:", lastid)fmt.println("插入成功")
执行结果
mysql
更新数据
更新和添加差不多,用的都是exec。
代码
//更新数据sqlstr := `update userinfo set name=? where id=?;`result, err := db.exec(sqlstr, "吴彦祖666", 3)if err != nil { fmt.println("更新失败", err) return}//受影响的行数row_affect, err := result.rowsaffected()if err != nil { fmt.println("受影响行数获取失败:", err) return}fmt.println("受影响的行数:", row_affect)fmt.println("更新成功")
执行结果
mysql
删除数据
删除数据用的还是exec。
代码
//删除数据sqlstr := "delete from userinfo where id = ?;"result, err := db.exec(sqlstr, 3)if err != nil { fmt.println("删除失败", err) return}//受影响的行数row_affect, err := result.rowsaffected()if err != nil { fmt.println("受影响行数获取失败:", err) return}fmt.println("受影响的行数:", row_affect)fmt.println("删除成功")
执行结果
mysql
事物
事物,这个用的就比较多了,通常用在关键的场景。
尤其是转账,张三-10块,李四+10块,这个动作动作是要在一起完成的。
如果任何一个失败了,就要恢复上一次的状态。
我们通常也叫这个操作叫做原子操作,要成功,都成功,要完蛋,都完蛋。
新建表create table `bill` ( `id` int(11) not null auto_increment, `name` varchar(8) not null, `money` int(11) not null, primary key (`id`)) engine=innodb auto_increment=3 default charset=utf8mb4;
表数据
张三和李四都剩余100块
go mysql 关于事物相关方法
go 关于事物有三个方法
begin()开始事物。
commit()提交事物。
rollback()失败回滚。
模拟转账:张三-10块,李四+十块代码
func main() { //事物 //开启事物 tx, err := db.begin() if err != nil { //释放事物 if tx != nil { tx.rollback() } fmt.println("事物开启失败") return} 张三减10块sql := `update bill set money=money - 10 where name = ?;` result, err := tx.exec(张三减10块sql, "张三") if err != nil { //有错误表示更是失败,回滚原来状态 tx.rollback() fmt.println(err) return} 张三受影响行数, err := result.rowsaffected() if err != nil { tx.rollback() // 回滚 return} 李四加10块sql := `update bill set money=money + 10 where name = ?;` result, err = tx.exec(李四加10块sql, "李四") if err != nil { //有错误表示更是失败,回滚原来状态 tx.rollback() fmt.println(err) return} 李四受影响行数, err := result.rowsaffected() if err != nil { tx.rollback() // 回滚 return} //都等于1表示成功,可以提交事务,修改数据 if 张三受影响行数==1 && 李四受影响行数==1{ //提交事务 fmt.println("提交事务") tx.commit() }else{ //有一个!=1表示没有更新成功,可能用户不存在 fmt.println("失败了,事物回滚了") tx.rollback()} fmt.println("事物执行成功")}
执行结果
mysql
一加一减
假如出错了
mysql
如果使用事物,出错了数据还是没变。
总结
本次主要讲述了go如何操作mysql,如何进行增删改查,最后还讲了以下什么是事物,如何操作事物。
以上就是go语言操作mysql语言基础知识的详细内容。
其它类似信息

推荐信息