码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Golang操作Mysql


    一、驱动介绍

    目前Go语言中支持MySQL的驱动较多,部分是支持database/sql标准,部分是采用自己实现的接口。

    常用的驱动有如下几种:

    • GitHub - go-sql-driver/mysql: Go MySQL Driver is a MySQL driver for Go's (golang) database/sql packagehttps://github.com/go-sql-driver/mysql支持database/sql,全部采用Go语言编写。
    • GitHub - ziutek/mymysql: MySQL Client API written entirely in GoMySQL Client API written entirely in Go. Contribute to ziutek/mymysql development by creating an account on GitHub.https://github.com/ziutek/mymysql支持database/sql,也支持自定义的接口,全部采用Go语言编写。
    • GitHub - Philio/GoMySQL: The most complete and stable MySQL client library written completely in Go. For discussion, ideas, suggestions, feature requests etc, please visit the GoMySQL Google Group (link below). For any issues/bugs or need some help, please post an issue on Github.The most complete and stable MySQL client library written completely in Go. For discussion, ideas, suggestions, feature requests etc, please visit the GoMySQL Google Group (link below). For any issues/bugs or need some help, please post an issue on Github. - GitHub - Philio/GoMySQL: The most complete and stable MySQL client library written completely in Go. For discussion, ideas, suggestions, feature requests etc, please visit the GoMySQL Google Group (link below). For any issues/bugs or need some help, please post an issue on Github.https://github.com/Philio/GoMySQL不支持database/sql,自定义接口,全部采用Go语言编写。

    二、go-sql-driver/mysql 介绍与应用

    2.1 采用理由

    1. 该驱动比较新,维护得比较好。
    2. 完全支持database/sql接口。
    3. 支持Keepalive,保持长链接。

    2.2 实践与应用

    这里采用go_test数据库、user表。

    建表语句

    1. DROP TABLE IF EXISTS `user`;
    2. CREATE TABLE `user` (
    3. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增',
    4. `user_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名',
    5. `depart_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    6. `create_at` date NULL DEFAULT NULL,
    7. PRIMARY KEY (`id`) USING BTREE
    8. ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

    增删改查

    1. package main
    2. import (
    3. "database/sql"
    4. "fmt"
    5. _ "github.com/go-sql-driver/mysql"
    6. )
    7. type User struct {
    8. id int64
    9. username string
    10. departName string
    11. createAt string
    12. }
    13. func main() {
    14. db, err := sql.Open("mysql", "root:123456@tcp(192.168.158.328:33066)/go_test?charset=utf8")
    15. checkErr(err)
    16. // 插入数据
    17. userId := insertUserOne(db)
    18. // 查询数据
    19. queryUserOne(db)
    20. // 更改数据
    21. updateUserOne(db, userId)
    22. // 查询数据
    23. queryUserOne(db)
    24. // 删除数据
    25. deleteUserOne(db, userId)
    26. }
    27. // 插入用户数据
    28. func insertUserOne(db *sql.DB) (userId int64) {
    29. stmt, err := db.Prepare("INSERT user set user_name=?,depart_name=?,create_at=?")
    30. checkErr(err)
    31. res, err := stmt.Exec("李四", "运营部", "2000-10-10")
    32. checkErr(err)
    33. // 得到插入后的主键id
    34. id, err := res.LastInsertId()
    35. checkErr(err)
    36. fmt.Println("插入后返回主键id", id)
    37. return id
    38. }
    39. // 更新用户数据
    40. func updateUserOne(db *sql.DB, id int64) {
    41. stmt, err := db.Prepare("update user set user_name= ? where id=?")
    42. checkErr(err)
    43. res, err := stmt.Exec("李四改", id)
    44. checkErr(err)
    45. affected, err := res.RowsAffected()
    46. checkErr(err)
    47. fmt.Println("作用的更新记录数", affected)
    48. }
    49. // 查询用户,暂时就不返回list了
    50. func queryUserOne(db *sql.DB) {
    51. // 这里查询出来的字段顺序需要与结构体字段顺序吧保持一致
    52. rows, err := db.Query("SELECT * FROM user")
    53. checkErr(err)
    54. for rows.Next() {
    55. user := User{}
    56. err := rows.Scan(&user.id, &user.username, &user.departName, &user.createAt)
    57. checkErr(err)
    58. fmt.Println("查询到的用户数据", user.id, user.username, user.departName, user.createAt)
    59. }
    60. }
    61. // 删除用户数据
    62. func deleteUserOne(db *sql.DB, id int64) {
    63. stmt, err := db.Prepare("delete from user where id=?")
    64. checkErr(err)
    65. res, err := stmt.Exec(id)
    66. checkErr(err)
    67. affected, err := res.RowsAffected()
    68. checkErr(err)
    69. fmt.Println("删除作用行数", affected)
    70. db.Close()
    71. }
    72. // 检查错误
    73. func checkErr(err error) {
    74. if err != nil {
    75. panic(err)
    76. }
    77. }

    运行结果

    插入后返回主键id 4
    查询到的用户数据 4 李四 运营部 2000-10-10  
    作用的更新记录数 1                         
    查询到的用户数据 4 李四改 运营部 2000-10-10
    删除作用行数 1     

    3 补充说明 

    3.1 sql.Open函数

    该函数旨在打开一个注册过的数据库驱动,需要引入 _ "github.com/go-sql-driver/mysql" ,不然程序会报错。

    该函数第一个参数是数据库驱动名称,这里是 mysql。

    该函数第二个参数是Data Source Name,及链接和配置信息,支持格式如: 

    • user@unix(/path/to/socket)/dbname?charset=utf8
    • username:password@tcp(localhost:3306)/dbname?charset=utf8  (本文采用)
    • username:password@/dbname
    • username:password@tcp([de:ad:be:ee::ca:fe]:80)/dbname

    源代码如下:

    1. func Open(driverName, dataSourceName string) (*DB, error) {
    2. driversMu.RLock()
    3. driveri, ok := drivers[driverName]
    4. driversMu.RUnlock()
    5. if !ok {
    6. return nil, fmt.Errorf("sql: unknown driver %q (forgotten import?)", driverName)
    7. }
    8. if driverCtx, ok := driveri.(driver.DriverContext); ok {
    9. connector, err := driverCtx.OpenConnector(dataSourceName)
    10. if err != nil {
    11. return nil, err
    12. }
    13. return OpenDB(connector), nil
    14. }
    15. return OpenDB(dsnConnector{dsn: dataSourceName, driver: driveri}), nil
    16. }

    3.2 db.Prepare()函数

    用来返回准备要执行的SQL操作,然后返回准备完毕的执行状态。源代码如下:

    1. func (db *DB) Prepare(query string) (*Stmt, error) {
    2. return db.PrepareContext(context.Background(), query)
    3. }

    3.3 db.Query()函数

    用来直接执行SQL返回Rows结果,源代码如下:

    1. func (db *DB) Query(query string, args ...interface{}) (*Rows, error) {
    2. return db.QueryContext(context.Background(), query, args...)
    3. }

    3.4 stmt.Exec()

    用来执行stmt准备好的语句,源代码如下:

    1. // Exec executes a prepared statement with the given arguments and
    2. // returns a Result summarizing the effect of the statement.
    3. //
    4. // Exec uses context.Background internally; to specify the context, use
    5. // ExecContext.
    6. func (s *Stmt) Exec(args ...interface{}) (Result, error) {
    7. return s.ExecContext(context.Background(), args...)
    8. }

    PS:

    不用数据库链接后考虑关掉数据库链接。

  • 相关阅读:
    springmvc静态资源配置
    xctf攻防世界 Web高手进阶区 shrine
    tars 的基本使用——使用 tars 发布服务
    叮咚外卖小程序6.4.3+超级跑腿2.0.3+前端完美运营版【未编译前端+教程】
    C# 使用模式匹配的好处,因为好用所以推荐~
    螺栓防松设计
    electron模板【lectron-react-boilerplate】多窗口配置【HtmlWebpackPlugin】多页面配置
    Java 操作RestHighLevelClient查询详解
    ValueError: Maximum allowed size exceeded
    D1. 388535 (Easy Version)(异或+二进制位)
  • 原文地址:https://blog.csdn.net/u011937566/article/details/125630181
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号