• sqlx库使用指南


    sqlx库使用指南
    在项目中我们通常可能会使用database/sql连接MySQL数据库。本文借助使用sqlx实现批量插入数据的例子,介绍了sqlx中可能被你忽视了的sqlx.In和DB.NamedExec方法。
    sqlx介绍
    在项目中我们通常可能会使用database/sql连接MySQL数据库。sqlx可以认为是Go语言内置database/sql的超集,它在优秀的内置database/sql基础上提供了一组扩展。这些扩展中除了大家常用来查询的Get(dest interface{}, ...) error和Select(dest interface{}, ...) error外还有很多其他强大的功能。

    代码:

    创建你数据表

    1. CREATE TABLE `user` (
    2. `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    3. `name` VARCHAR(20) DEFAULT '',
    4. `age` INT(11) DEFAULT '0',
    5. PRIMARY KEY(`id`)
    6. )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

    代码的增删改查;

    1. package main
    2. import (
    3. "fmt"
    4. _ "github.com/go-sql-driver/mysql"
    5. "github.com/jmoiron/sqlx"
    6. )
    7. type user struct {
    8. Id int
    9. Age int
    10. Name string
    11. }
    12. var db *sqlx.DB
    13. func initDB() (err error) {
    14. dsn := "root:root123456@tcp(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True"
    15. // 也可以使用MustConnect连接不成功就panic
    16. db, err = sqlx.Connect("mysql", dsn)
    17. if err != nil {
    18. fmt.Printf("connect DB failed, err:%v\n", err)
    19. return
    20. }
    21. db.SetMaxOpenConns(20)
    22. db.SetMaxIdleConns(10)
    23. return
    24. }
    25. // 插入数据
    26. func insertRowDemo() {
    27. sqlStr := "insert into user(name, age) values (?,?)"
    28. ret, err := db.Exec(sqlStr, "沙河小王子", 19)
    29. if err != nil {
    30. fmt.Printf("insert failed, err:%v\n", err)
    31. return
    32. }
    33. theID, err := ret.LastInsertId() // 新插入数据的id
    34. if err != nil {
    35. fmt.Printf("get lastinsert ID failed, err:%v\n", err)
    36. return
    37. }
    38. fmt.Printf("insert success, the id is %d.\n", theID)
    39. }
    40. // 更新数据
    41. func updateRowDemo() {
    42. sqlStr := "update user set age=? where id = ?"
    43. ret, err := db.Exec(sqlStr, 39, 6)
    44. if err != nil {
    45. fmt.Printf("update failed, err:%v\n", err)
    46. return
    47. }
    48. n, err := ret.RowsAffected() // 操作影响的行数
    49. if err != nil {
    50. fmt.Printf("get RowsAffected failed, err:%v\n", err)
    51. return
    52. }
    53. fmt.Printf("update success, affected rows:%d\n", n)
    54. }
    55. // 删除数据
    56. func deleteRowDemo() {
    57. sqlStr := "delete from user where id = ?"
    58. ret, err := db.Exec(sqlStr, 1)
    59. if err != nil {
    60. fmt.Printf("delete failed, err:%v\n", err)
    61. return
    62. }
    63. n, err := ret.RowsAffected() // 操作影响的行数
    64. if err != nil {
    65. fmt.Printf("get RowsAffected failed, err:%v\n", err)
    66. return
    67. }
    68. fmt.Printf("delete success, affected rows:%d\n", n)
    69. }
    70. // 查询单条数据示例
    71. func queryRowDemo() {
    72. sqlStr := "select id, name, age from user where id=?"
    73. var u user
    74. err := db.Get(&u, sqlStr, 2)
    75. if err != nil {
    76. fmt.Printf("get failed, err:%v\n", err)
    77. return
    78. }
    79. fmt.Printf("id:%d name:%s age:%d\n", u.Id, u.Name, u.Age)
    80. }
    81. // 查询多条数据示例
    82. func queryMultiRowDemo() {
    83. sqlStr := "select id, name, age from user where id > ?"
    84. var users []user
    85. err := db.Select(&users, sqlStr, 0)
    86. if err != nil {
    87. fmt.Printf("query failed, err:%v\n", err)
    88. return
    89. }
    90. fmt.Printf("users:%#v\n", users)
    91. }
    92. func main() {
    93. initDB()
    94. insertRowDemo()
    95. queryRowDemo()
    96. deleteRowDemo()
    97. fmt.Println("==============")
    98. queryRowDemo()
    99. fmt.Println("==============")
    100. queryMultiRowDemo()
    101. }

  • 相关阅读:
    Freeswitch中mod_commonds
    深度学习实战02-卷积神经网络(CNN)实现服装图像分类
    Java第5章 抽象类与接口
    Python数值基本计算
    口袋参谋:淘宝生意参谋指数,如何一键转换成真实数值?
    新华三路由器+华为交换机,实现华为交换机指定端口访问外网
    Redis 的缓存过期策略
    图像对比度增强
    Spring 推断构造方法
    Allegro如何录制SCR快捷键操作指导
  • 原文地址:https://blog.csdn.net/wtt234/article/details/132714779