golang连接mysql数据库实现增删改查

昝辉Zac Zac的SEO博客,坚持12年,优化成为生活。

下面看一篇关于golang连接mysql数据库实现增删改查数据的例子,希望本文章能帮助到了解golang与mysql数据库之间关系了.

golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动,这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/MySQL这个驱动,更新维护都比较好,下面演示下具体的使用,完整代码示例可以参考最后.

下载驱动:sudo go get github.com/go-sql-driver/mysql

如果提示这样的失败信息:cannot download, $GOPATH not set. For more details see: go help gopath,可以使用如下命令解决.

sudo env GOPATH=/Users/chenjiebin/golang go get github.com/go-sql-driver/mysql

GOPATH的值根据自行环境进行替换.

创建测试表,在mysql test库中创建测试表,代码如下:

  1. CREATETABLEIFNOTEXISTS`test`.`user`(
  2. `user_id`INT(11)UNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT'用户编号',
  3. `user_name`VARCHAR(45)NOTNULLCOMMENT'用户名称',
  4. `user_age`TINYINT(3)UNSIGNEDNOTNULLDEFAULT0COMMENT'用户年龄',
  5. `user_sex`TINYINT(3)UNSIGNEDNOTNULLDEFAULT0COMMENT'用户性别',--phpfensi.com
  6. PRIMARYKEY(`user_id`))
  7. ENGINE=InnoDB
  8. AUTO_INCREMENT=1
  9. DEFAULTCHARACTERSET=utf8
  10. COLLATE=utf8_general_ci
  11. COMMENT='用户表'

数据库连接,数据库连接使用datebase/sql Open函数进行连接,代码如下:

db,err := sql.Open("mysql", "user:password@tcp(localhost:5555)/dbname?charset=utf8")

其中连接参数可以有如下几种形式:

  1. user@unix(/path/to/socket)/dbname?charset=utf8
  2. user:password@tcp(localhost:5555)/dbname?charset=utf8
  3. user:password@/dbname
  4. user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname

通常我们都用第二种.

插入操作,代码如下:

  1. stmt,err:=db.Prepare(`INSERTuser(user_name,user_age,user_sex)values(?,?,?)`)
  2. checkErr(err)
  3. res,err:=stmt.Exec("tony",20,1)
  4. checkErr(err)
  5. id,err:=res.LastInsertId()
  6. checkErr(err)
  7. fmt.Println(id)

这里使用结构化操作,不推荐使用直接拼接sql语句的方法.

查询操作,代码如下:

  1. rows,err:=db.Query("SELECT*FROMuser")
  2. checkErr(err)
  3. forrows.Next(){
  4. varuserIdint
  5. varuserNamestring
  6. varuserAgeint
  7. varuserSexint
  8. rows.Columns()
  9. err=rows.Scan(&userId,&userName,&userAge,&userSex)
  10. checkErr(err)
  11. fmt.Println(userId)
  12. fmt.Println(userName)
  13. fmt.Println(userAge)
  14. fmt.Println(userSex)
  15. }

这里查询的方式使用声明4个独立变量userId、userName、userAge、userSex来保存查询出来的每一行的值,在实际开发中通常会封装数据库的操作,对这样的查询通常会考虑返回字典类型,代码如下:

  1. //构造scanArgs、values两个数组,scanArgs的每个值指向values相应值的地址
  2. columns,_:=rows.Columns()
  3. scanArgs:=make([]interface{},len(columns))
  4. values:=make([]interface{},len(columns))
  5. fori:=rangevalues{
  6. scanArgs[i]=&values[i]
  7. }
  8. forrows.Next(){
  9. //将行数据保存到record字典
  10. err=rows.Scan(scanArgs...)
  11. record:=make(map[string]string)
  12. fori,col:=rangevalues{
  13. ifcol!=nil{
  14. record[columns[i]]=string(col.([]byte))
  15. }
  16. }
  17. fmt.Println(record)
  18. }

修改操作:

  1. stmt,err:=db.Prepare(`UPDATEuserSETuser_age=?,user_sex=?WHEREuser_id=?`)
  2. checkErr(err)
  3. res,err:=stmt.Exec(21,2,1)
  4. checkErr(err)
  5. num,err:=res.RowsAffected()
  6. checkErr(err)
  7. fmt.Println(num)

删除操作:

  1. stmt,err:=db.Prepare(`DELETEFROMuserWHEREuser_id=?`)
  2. checkErr(err)
  3. res,err:=stmt.Exec(1)
  4. checkErr(err)
  5. num,err:=res.RowsAffected()
  6. checkErr(err)
  7. fmt.Println(num)

修改和删除操作都比较简单,同插入数据类似,只是使用RowsAffected来获取影响的数据行数,完整代码如下:

  1. packagemain
  2. import(
  3. "database/sql"
  4. "fmt"
  5. _"github.com/go-sql-driver/mysql"
  6. )
  7. funcmain(){
  8. insert()
  9. }
  10. //插入demo
  11. funcinsert(){
  12. db,err:=sql.Open("mysql","root:@/test?charset=utf8")
  13. checkErr(err)
  14. stmt,err:=db.Prepare(`INSERTuser(user_name,user_age,user_sex)values(?,?,?)`)
  15. checkErr(err)
  16. res,err:=stmt.Exec("tony",20,1)
  17. checkErr(err)
  18. id,err:=res.LastInsertId()
  19. checkErr(err)
  20. fmt.Println(id)
  21. }
  22. //查询demo
  23. funcquery(){
  24. db,err:=sql.Open("mysql","root:@/test?charset=utf8")
  25. checkErr(err)
  26. rows,err:=db.Query("SELECT*FROMuser")
  27. checkErr(err)
  28. //普通demo
  29. //forrows.Next(){
  30. //varuserIdint
  31. //varuserNamestring
  32. //varuserAgeint
  33. //varuserSexint
  34. //rows.Columns()
  35. //err=rows.Scan(&userId,&userName,&userAge,&userSex)
  36. //checkErr(err)
  37. //fmt.Println(userId)
  38. //fmt.Println(userName)
  39. //fmt.Println(userAge)
  40. //fmt.Println(userSex)
  41. //}
  42. //字典类型
  43. //构造scanArgs、values两个数组,scanArgs的每个值指向values相应值的地址
  44. columns,_:=rows.Columns()
  45. scanArgs:=make([]interface{},len(columns))
  46. values:=make([]interface{},len(columns))
  47. fori:=rangevalues{
  48. scanArgs[i]=&values[i]
  49. }
  50. forrows.Next(){
  51. //将行数据保存到record字典
  52. err=rows.Scan(scanArgs...)
  53. record:=make(map[string]string)
  54. fori,col:=rangevalues{
  55. ifcol!=nil{
  56. record[columns[i]]=string(col.([]byte))
  57. }
  58. }
  59. fmt.Println(record)
  60. }
  61. }
  62. //更新数据
  63. funcupdate(){
  64. db,err:=sql.Open("mysql","root:@/test?charset=utf8")
  65. checkErr(err)
  66. stmt,err:=db.Prepare(`UPDATEuserSETuser_age=?,user_sex=?WHEREuser_id=?`)
  67. checkErr(err)
  68. res,err:=stmt.Exec(21,2,1)
  69. checkErr(err)
  70. num,err:=res.RowsAffected()
  71. checkErr(err)
  72. fmt.Println(num)
  73. }
  74. //删除数据
  75. funcremove(){
  76. db,err:=sql.Open("mysql","root:@/test?charset=utf8")
  77. checkErr(err)
  78. stmt,err:=db.Prepare(`DELETEFROMuserWHEREuser_id=?`)
  79. checkErr(err)//phpfensi.com
  80. res,err:=stmt.Exec(1)
  81. checkErr(err)
  82. num,err:=res.RowsAffected()
  83. checkErr(err)
  84. fmt.Println(num)
  85. }
  86. funccheckErr(errerror){
  87. iferr!=nil{
  88. panic(err)
  89. }
  90. }

小结:整体上来说都比较简单,就是查询那边使用字典来存储返回数据比较复杂一些,既然说到数据库连接,通常应用中都会使用连接池来减少连接开销,关于连接池下次整理一下再放上来.

相关广告
  • golang连接mysql数据库实现增删改查 golang连接mysql数据库实现增删改查 golang连接mysql数据库实现增删改查
相关阅读

golang连接mysql数据库实现增删改查

2019/10/10 17:32:09 | 谷歌SEO算法 | 手机网站制作