1 数据库表

  1. CREATE TABLE `users` (
  2. `id` int(10) UNSIGNED NOT NULL,
  3. `name` varchar(25) NOT NULL,
  4. `age` tinyint(3) UNSIGNED NOT NULL DEFAULT '0'
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  6. --
  7. -- 转存表中的数据 `users`
  8. --
  9. INSERT INTO `users` (`id`, `name`, `age`) VALUES
  10. (1, '张三', 25),
  11. (2, '李四', 22),
  12. (3, '田七', 25);

2 连接数据库

mysql.go

  1. package dbs
  2. import (
  3. "database/sql"
  4. "fmt"
  5. _ "github.com/go-sql-driver/mysql"
  6. "log"
  7. "time"
  8. )
  9. var MysqlDb *sql.DB
  10. var MysqlDbErr error
  11. const (
  12. USER_NAME = "root"
  13. PASS_WORD = "root"
  14. HOST = "localhost"
  15. PORT = "3306"
  16. DATABASE = "demo"
  17. CHARSET = "utf8"
  18. )
  19. // 初始化链接
  20. func init() {
  21. dbDSN := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s", USER_NAME, PASS_WORD, HOST, PORT, DATABASE, CHARSET)
  22. // 打开连接失败
  23. MysqlDb, MysqlDbErr = sql.Open("mysql", dbDSN)
  24. //defer MysqlDb.Close();
  25. if MysqlDbErr != nil {
  26. log.Println("dbDSN: " + dbDSN)
  27. panic("数据源配置不正确: " + MysqlDbErr.Error())
  28. }
  29. // 最大连接数
  30. MysqlDb.SetMaxOpenConns(100)
  31. // 闲置连接数
  32. MysqlDb.SetMaxIdleConns(20)
  33. // 最大连接周期
  34. MysqlDb.SetConnMaxLifetime(100*time.Second)
  35. if MysqlDbErr = MysqlDb.Ping(); nil != MysqlDbErr {
  36. panic("数据库链接失败: " + MysqlDbErr.Error())
  37. }
  38. }

3 增删改查

user.go

  1. package dbs
  2. import (
  3. "fmt"
  4. )
  5. // 用户表结构体
  6. type User struct {
  7. Id int64 `db:"id"`
  8. Name string `db:"name"`
  9. Age int `db:"age"`
  10. }
  11. // 查询数据,指定字段名
  12. func StructQueryField() {
  13. user := new(User)
  14. row := MysqlDb.QueryRow("select id, name, age from users where id=?",1)
  15. if err :=row.Scan(&user.Id,&user.Name,&user.Age); err != nil{
  16. fmt.Printf("scan failed, err:%v",err)
  17. return
  18. }
  19. fmt.Println(user.Id,user.Name,user.Age)
  20. }
  21. // 查询数据,取所有字段
  22. func StructQueryAllField() {
  23. // 通过切片存储
  24. users := make([]User, 0)
  25. rows, _:= MysqlDb.Query("SELECT * FROM `users` limit ?",100)
  26. // 遍历
  27. var user User
  28. for rows.Next(){
  29. rows.Scan(&user.Id, &user.Name, &user.Age)
  30. users=append(users,user)
  31. }
  32. fmt.Println(users)
  33. }
  34. // 插入数据
  35. func StructInsert() {
  36. ret,_ := MysqlDb.Exec("insert INTO users(name,age) values(?,?)","小红",23)
  37. //插入数据的主键id
  38. lastInsertID,_ := ret.LastInsertId()
  39. fmt.Println("LastInsertID:",lastInsertID)
  40. //影响行数
  41. rowsaffected,_ := ret.RowsAffected()
  42. fmt.Println("RowsAffected:",rowsaffected)
  43. }
  44. // 更新数据
  45. func StructUpdate() {
  46. ret,_ := MysqlDb.Exec("UPDATE users set age=? where id=?","100",1)
  47. upd_nums,_ := ret.RowsAffected()
  48. fmt.Println("RowsAffected:",upd_nums)
  49. }
  50. // 删除数据
  51. func StructDel() {
  52. ret,_ := MysqlDb.Exec("delete from users where id=?",1)
  53. del_nums,_ := ret.RowsAffected()
  54. fmt.Println("RowsAffected:",del_nums)
  55. }
  56. // 事务处理,结合预处理
  57. func StructTx() {
  58. //事务处理
  59. tx, _ := MysqlDb.Begin();
  60. // 新增
  61. userAddPre, _ := MysqlDb.Prepare("insert into users(name, age) values(?, ?)");
  62. addRet, _ := userAddPre.Exec("zhaoliu", 15);
  63. ins_nums, _ := addRet.RowsAffected();
  64. // 更新
  65. userUpdatePre1, _ := tx.Exec("update users set name = 'zhansan' where name=?", "张三");
  66. upd_nums1, _ := userUpdatePre1.RowsAffected();
  67. userUpdatePre2, _ := tx.Exec("update users set name = 'lisi' where name=?", "李四");
  68. upd_nums2, _ := userUpdatePre2.RowsAffected();
  69. fmt.Println(ins_nums);
  70. fmt.Println(upd_nums1);
  71. fmt.Println(upd_nums2);
  72. if ins_nums > 0 && upd_nums1 > 0 && upd_nums2 > 0 {
  73. tx.Commit();
  74. }else{
  75. tx.Rollback();
  76. }
  77. }
  78. // 查询数据,指定字段名,不采用结构体
  79. func RawQueryField() {
  80. rows, _ := MysqlDb.Query("select id,name from users");
  81. if rows == nil {
  82. return
  83. }
  84. id := 0;
  85. name := "";
  86. fmt.Println(rows)
  87. fmt.Println(rows)
  88. for rows.Next() {
  89. rows.Scan(&id, &name);
  90. fmt.Println(id, name);
  91. }
  92. }
  93. // 查询数据,取所有字段,不采用结构体
  94. func RawQueryAllField() {
  95. //查询数据,取所有字段
  96. rows2, _ := MysqlDb.Query("select * from users");
  97. //返回所有列
  98. cols, _ := rows2.Columns();
  99. //这里表示一行所有列的值,用[]byte表示
  100. vals := make([][]byte, len(cols));
  101. //这里表示一行填充数据
  102. scans := make([]interface{}, len(cols));
  103. //这里scans引用vals,把数据填充到[]byte里
  104. for k, _ := range vals {
  105. scans[k] = &vals[k];
  106. }
  107. i := 0;
  108. result := make(map[int]map[string]string);
  109. for rows2.Next() {
  110. //填充数据
  111. rows2.Scan(scans...);
  112. //每行数据
  113. row := make(map[string]string);
  114. //把vals中的数据复制到row中
  115. for k, v := range vals {
  116. key := cols[k];
  117. //这里把[]byte数据转成string
  118. row[key] = string(v);
  119. }
  120. //放入结果集
  121. result[i] = row;
  122. i++;
  123. }
  124. fmt.Println(result);
  125. }

4 入口调用测试

main.go

  1. package main
  2. import "go_mysql/dbs"
  3. func main() {
  4. dbs.StructInsert()
  5. dbs.StructUpdate()
  6. dbs.StructQueryField()
  7. dbs.StructQueryAllField()
  8. dbs.StructDel()
  9. dbs.StructTx()
  10. dbs.RawQueryField()
  11. dbs.RawQueryAllField()
  12. }

最终代码结构

  1. ├── dbs
  2. ├── mysql.go 连接mysql
  3. └── user.go user表操作
  4. ├── go.mod
  5. ├── go.sum
  6. ├── main.go 入口文件
  7. ├── Makefile
  8. └── vendor


4人点赞

golang

作者:零一间
链接:https://www.jianshu.com/p/9b5cd762e256
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。