当前位置: 首页 > 科技观察

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

时间:2023-03-12 00:06:32 科技观察

前言通常我们程序员和数据库打交道最多。不然怎么能叫coder呢?保存用户信息需要数据库,保存订单需要数据库等等,现在真的是数据驱动开发了。但是数据库的种类很多,有Mysql、Oracle、SQLServer等。本文以Go操作Mysql为例。准备工作本次使用gomod进行包依赖管理。不知道怎么用的可以爬梯子找gomod的用法。使用的库是第三方库go-sql-driver/mysql。连接数据库代码funcmain(){varusername="root"varpassword="rootroot"varip="127.0.0.1"varport="3306"vardata="go_mysql_demo"vardsn=fmt.Sprintf("%s:%s@tcp(%s:%s)/%s",username,password,ip,port,data)//打开只会验证dsb的格式是否正确,不会验证连接是否成功。同样,密码是否正确知道db,err:=sql.Open("mysql",dsn)iferr!=nil{panic(err)}//err后关闭连接,因为直接打开可能会失败,关闭未打开的连接???deferdb.Close()//此时尝试连接数据库,判断用户、密码、ip、端口是否正确err=db.Ping()iferr!=nil{fmt.Println("Failedtoconnecttothedatabase,"err)return}//设置数据库最大连接数,一般不管db.SetMaxOpenConns(100)//设置连接池最大空闲连接数,一般不管db.SetMaxIdleConns(50)}注意sql.Open只会校验格式是否正确,不会连接数据库。db.Close在err之后,因为它可能无法打开和关闭未打开的连接。db.Ping会连接数据库,判断用户、密码、ip地址、端口是否正确。准备创建一个表我们创建一个简单的用户表。创建表`userinfo`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(10)DEFAULTNULL,`phone`char(11)DEFAULTNULL,`address`varchar(64)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;创建结构的准备工作假定上述工作已经完成。不知道有没有想过,我们查询的数据是什么,存储为?,字符串?地图?片?好像不太好。只有结构是最清晰和最广为人知的。结构typeUserinfostruct{Idint64`json:"id"`Namestring`json:"name"`Phonestring`json:"phone"`Addressstring`json:"address"`}使用QueryRow方法查询单个查询。代码//查询单个sqlStr:="SELECTid,`name`,phone,addressfromuserinfowhereid=?;"varuserUserinfo/*QueryRow第二个参数可以接收多个参数,同理,sqlStr可以有多个吗?占位符用于匹配QueryRow后,必须调用Scan方法进行数据绑定和数据库链接释放*/err=db.QueryRow(sqlStr,1).Scan(&user.Id,&user.Name,&user.Phone,&user.Address)iferr!=nil{fmt.Println("queryfailed",err)return}fmt.Println(user)执行结果查询多个多行查询使用Query。代码//查询多个sqlStr:="SELECTid,`name`,phone,addressfromuserinfowhereid>=?"//参数同QueryRowrows,err:=db.Query(sqlStr,1)iferr!=nil{fmt.Println("Queryfailed:",err)return}//这里使用rows释放所有链接deferrows.Close()//遍历所有数据varuserList=make([]Userinfo,0,10)forrows.Next(){varuserUserinfoerr=rows.Scan(&user.Id,&user.Name,&user.Phone,&user.Address)iferr!=nil{fmt.Println("绑定数据失败",err)return}userList=append(userList,user)}英尺。Println(userList)执行结果插入数据。插入数据需要执行。代码//插入数据sqlStr:="INSERTintouserinfo(name,phone,address)values(?,?,?);"result,err:=db.Exec(sqlStr,"吴彦祖",555,"我没有knowwhere")iferr!=nil{fmt.Println("Insertfailure",err)return}//受影响的行数row_affect,err:=result.RowsAffected()iferr!=nil{fmt.Println("Affectedrows获取失败:",err)return}fmt.Println("受影响的行数:",row_affect)lastId,err:=result.LastInsertId()iferr!=nil{fmt.Println("获取新行失败id:",err)return}fmt.Println("newlineid:",lastId)fmt.Println("insertsuccessfully")执行结果mysqlupdate数据更新和add类似,都是用Exec。代码//更新数据sqlStr:=`UPDATEuserinfosetname=?whereid=?;`result,err:=db.Exec(sqlStr,"DanielWu666",3)iferr!=nil{fmt.Println("更新失败",err)return}//受影响行数row_affect,err:=result.RowsAffected()iferr!=nil{fmt.Println("获取受影响行数失败:",err)return}fmt.Println("AffectedThenumberofrows:",row_affect)fmt.Println("更新成功")执行结果Mysql删除数据,用Exec删除数据。代码//删除数据sqlStr:="deletefromuserinfowhereid=?;"result,err:=db.Exec(sqlStr,3)iferr!=nil{fmt.Println("删除失败",err)return}//影响数rowsrow_affect,err:=result.RowsAffected()iferr!=nil{fmt.Println("受影响的行获取失败:",err)return}fmt.Println("受影响的行:",row_affect)fmt.Println("deletedsuccessfully")执行Mysql事务的结果,用的比较多,一般用在关键场景。尤其是转账,张三——10元,李四+10元,这个动作一定要一起做。如果任何一个失败,则恢复上一个状态。我们通常称这种操作为原子操作。成功了就成功了,完了就完了。创建表`bill`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(8)NOTNULL,`money`int(11)NOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=3DEFAULTCHARSET=utf8mb4;表数据张三和李四都还剩100元。GoMysql关于事物的相关方法Go关于事物的方法有3个Begin()来启动事物。Commit()提交东西。Rollback()回滚失败。模拟转账:张三-10件,李四+10件tx.Rollback()}fmt.Println("Thingfailedtoopen")return}张三减10Sql:=`UPDATEbillsetmoney=money-10wherename=?;`result,err:=tx.Exec(张三减10Sql,"张三")iferr!=nil{//出现错误表示失败,回滚原状态tx.Rollback()fmt.Println(err)return}张三影响的行数,err:=结果。RowsAffected()iferr!=nil{tx.Rollback()//回滚返回}李思嘉10条sql:=`UPDATEbillsetmoney=money+10wherename=?;`result,err=tx.Exec(李思嘉10条sql,"李四")iferr!=nil{//错误表示失败,回滚到原来的状态tx.Rollback()fmt.Println(err)return}李四影响的行数,err:=result。RowsAffected()iferr!=nil{tx.Rollback()//回滚返回}//全部等于1表示成功,可以提交事务,修改数据如果张三受影响的行数==1&&affectedrowsoflisi==1{//Committhetransactionfmt.Println("Committhetransaction")tx.Commit()}else{//有一个!=1表示更新不成功,可能是userdoesnotexistfmt.Println("failed,thetransactionreturnsRolled.")tx.Rollback()}fmt.Println("Thingexecutedsuccessfully")}执行结果Mysql一加一减如果有错误Mysql如果你使用这个东西,如果有错误,数据仍然不会改变。小结这次主要讲了Go是怎么操作Mysql的,怎么增删改查,最后还讲了什么是东西,怎么操作一个东西。当然这是最原始的方法,过程有点繁琐,入门就好,后面还有更方便的方法。