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

CURD操作

时间:2023-03-12 14:06:13 科技观察

MySQL是目前Go语言开发中最常用的关系型数据库。使用Go语言控制数据库需要使用Go自带的database/sql和驱动go-sql-driver/mysql来实现。创建好的ForGo项目,需要参考驱动依赖:goget-ugithub.com/go-sql-driver/mysql使用MySQL驱动:funcOpen(driverName,dataSourceNamestring)(*DB,error)Open打开一个数据库dirverName指定,dataSourceName指定数据源,一般至少包括数据库文件名等连接所需的信息。初始化连接vardb*sql.DB//声明一个全局db变量//初始化MySQL函数funcinitMySQL()(errerror){dsn:="root:password@tcp(127.0.0.1:3306)/dbname"db,err=sql.Open("mysql",dsn)iferr!=nil{return}err=db.Ping()iferr!=nil{return}return}funcmain(){//初始化MySQLerr:=initMySQL()iferr!=nil{panic(err)}deferdb.Close()}初始化与MySQL的连接后,需要使用db.Ping函数判断是否连接成功。SetMaxOpenConnsfunc(db*DB)SetMaxOpenConns(nint)SetMaxOpenConns设置与数据库的最大连接数。如果n大于0且小于最大空闲连接数,则减少最大空闲连接数以匹配最大打开连接数的限制。如果n<=0,则不限制最大打开连接数,默认为0(无限制)。SetMaxIdleConnsfunc(db*DB)SetMaxIdleConns(nint)SetMaxIdleConns设置连接池中的最大空闲连接数。如果n大于最大打开连接数,则减少新的最大空闲连接数以匹配最大打开连接数的限制。如果n<=0,则不保留空闲连接。CURD进行CURD操作,需要和数据库建立连接,同时有数据进行操作(数据库和数据表):初始化数据创建数据库sql_demoCREATEDATABASEsql_demo;USEsql_demo;创建数据表名称`VARCHAR(20)DEFAULT'',`age`INT(11)DEFAULT'0',PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4;QuerySELECT接收数据,定义一个用户结构体接收数据:typeuserstruct{idintageintnamestring}查询一行数据db.QueryRow()执行一次查询,期望最多返回一行结果(即Row)。QueryRow总是返回一个非nil值,直到返回该值的Scan方法被调用,并返回一个延迟错误。(eg:noresultfound)func(db*DB)QueryRow(querystring,args...interface{})*Row示例代码如下://查询一行数据funcqueryRowDemo()(u1*user,errerror){//statement查询语句sqlStr:="SELECTid,name,ageFROMuserWHEREid=?"//声明一个用户类型变量varuuser//执行查询并扫描到uerr=db.QueryRow(sqlStr,1).Scan(&u.id,&u.age,&u.name)iferr!=nil{returnil,err}u1=&ureturn}funcmain(){//初始化MySQLerr:=initMySQL()iferr!=nil{panic(err)}deferdb.Close()u1,err:=queryRowDemo()iferr!=nil{fmt.Printf("err:%s",err)}fmt.Printf("id:%d,age:%d,name:%s\n",u1.id,u1.age,u1.name)"结果如下:id:1,age:111,name:22多行查询db.Query()执行查询,返回多行结果(即Rows),一般用于执行select命令,参数args表示查询中的占位参数。func(db*DB)Query(querystring,args...interface{})(*Rows,error)示例代码如下://查询多行数据funcqueryMultiRowDemo(){sqlStr:="SELECTid,name,ageFROMUserWHEREid>?"rows,err:=db.Query(sqlStr,0)iferr!=nil{fmt.Printf("querydatafailed,err:%s\n",err)return}//查询完数据后,需要连接数据库关闭延期。Close()forrows.Next(){varuusererr:=rows.Scan(&u.id,&u.age,&u.name)iferr!=nil{fmt.Printf("scandatafailed,err:%v\n",err)return}fmt.Printf("id:%dname:%sage:%d\n",u.id,u.name,u.age)}}执行结果:id:1name:111age:22id:3name:张三age:22使用rows.Next()循环遍历结果集中的数据。增加数据INSERT的增加、删除、更新操作都使用Exec方法。func(db*DB)Exec(querystring,args...interface{})(Result,error)示例代码如下://添加一行数据funcinsertRowDemo(){sqlStr:="INSERTINTOuser(name,age)VALUES(?,?)"result,err:=db.Exec(sqlStr,"小鱼",22)iferr!=nil{fmt.Printf("insertdatafailed,err:%v\n",err)return}id,错误:=结果}执行结果:insertsuccess,id:4updatedataUPDATE//更新一组数据funcupdateRowDemo(){sqlStr:="UPDATEuserSETage=?WHEREid=?"result,err:=db.Exec(sqlStr,22,1)iferr!=nil{fmt.Printf("updatedatafailed,err:%v\n",err)return}n,err:=result.RowsAffected()iferr!=nil{fmt.Printf("getrowsaffectedfailed,err:%v\n",err)返回}fmt.Printf("updatesuccess,affectedrows:%d\n",n)}删除数据DELETE//删除一行数据funcdeleteRowDemo(){sqlStr:="DELETEFROMuserWHEREid=?"result,err:=db.Exec(sqlStr,2)iferr!=nil{fmt.Printf("deleteddatafailed,err:%d\n",err)return}n,err:=result.RowsAffected()iferr!=nil{fmt.Printf("getaffectedfailed,err:%v\n",err)return}fmt.Printf("删除成功,受影响的行:%d\n",n)}