编程笔记 Golang基础 047 mysql数据库连接与操作

编程笔记 Golang基础 047 mysql数据库连接与操作

码农世界 2024-06-20 后端 96 次浏览 0个评论

编程笔记 Golang基础 047 mysql数据库连接与操作

  • 一、连接与操作
      • 1. 安装MySQL驱动
      • 2. 导入驱动包
      • 3. 连接数据库
      • 4. 执行SQL查询和操作
      • 5. 使用连接池
      • 6. 处理事务
      • 二、连接字符串
      • 三、应用示例
      • 四、比较

        MySQL凭借其开源、高效、稳定、灵活、安全以及广泛的社区支持等诸多优势,在全球范围内广受欢迎,尤其是在Web应用程序、云计算和大规模数据处理领域得到了广泛应用。

        一、连接与操作

        在Go语言中连接和操作MySQL数据库通常涉及以下步骤:

        1. 安装MySQL驱动

        要使用Go语言连接MySQL,首先需要安装一个兼容的数据库驱动。go-sql-driver/mysql 是一个广泛使用的开源驱动,可以通过 go get 命令来安装:

        go get -u github.com/go-sql-driver/mysql
        

        2. 导入驱动包

        在Go源代码中,你需要导入 database/sql 包以及 github.com/go-sql-driver/mysql 驱动包:

        import (
            "database/sql"
            _ "github.com/go-sql-driver/mysql"
        )
        

        这里的下划线 _ 表示虽然导入了包,但并不直接引用包内的任何变量或函数。由于MySQL驱动会通过其init函数自动注册到 database/sql 包的驱动列表中,因此只需要在导入时这样写即可。

        3. 连接数据库

        创建数据库连接实例,通常定义一个全局变量来存放 sql.DB 类型的对象:

        import (
            "fmt"
            "database/sql"
            _ "github.com/go-sql-driver/mysql"
        )
        func main() {
            // DSN (Data Source Name) 是包含数据库连接信息的字符串
            dsn := "user:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
            // 创建数据库连接
            db, err := sql.Open("mysql", dsn)
            if err != nil {
                panic(err.Error())
            }
            defer db.Close()
            // 检查连接是否有效
            err = db.Ping()
            if err != nil {
                panic(err.Error())
            } else {
                fmt.Println("Connected to the database!")
            }
        }
        

        DSN应当包含如下信息:

        • user: 数据库用户名
        • password: 密码
        • tcp(localhost:3306): 服务器地址和端口(这里是本地主机上的默认MySQL端口)
        • /dbname: 要连接的数据库名称
        • charset=utf8mb4: 设置字符集
        • parseTime=True: 让驱动解析时间类型字段为time.Time类型
        • loc=Local: 设置时区为本地时区

          4. 执行SQL查询和操作

          使用 db 对象执行SQL查询或更新操作:

          // 示例:执行查询
          rows, err := db.Query("SELECT * FROM users WHERE id = ?", 1)
          if err != nil {
              log.Fatal(err)
          }
          defer rows.Close()
          for rows.Next() {
              var id int
              var name string
              // 根据实际表结构定义其他列变量
              err = rows.Scan(&id, &name, ...)
              if err != nil {
                  log.Fatal(err)
              }
              fmt.Println(id, name)
          }
          // 示例:执行插入或更新操作
          _, err = db.Exec("INSERT INTO users (name, email) VALUES (?, ?)", "John Doe", "john.doe@example.com")
          if err != nil {
              log.Fatal(err)
          }
          

          5. 使用连接池

          为了提高性能和资源利用率,可以利用 sql.DB 自带的连接池功能:

          // 初始化连接池
          var maxOpenConns = 10
          var maxIdleConns = 5
          db.SetMaxOpenConns(maxOpenConns)
          db.SetMaxIdleConns(maxIdleConns)
          

          6. 处理事务

          对于涉及到多条SQL语句需要原子性执行的情况,可以使用事务:

          tx, err := db.Begin()
          if err != nil {
              return err
          }
          // 在事务内执行操作
          _, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE user_id = ?", amount, userId)
          if err != nil {
              tx.Rollback()
              return err
          }
          _, err = tx.Exec("INSERT INTO transactions ...")
          if err != nil {
              tx.Rollback()
              return err
          }
          // 提交事务
          err = tx.Commit()
          if err != nil {
              return err
          }
          

          以上就是使用Go语言连接MySQL数据库并进行基本操作的一个大致流程。根据实际需求,可能还需要处理更复杂的情况,例如预编译SQL语句、分页查询、批量操作等。

          二、连接字符串

          Go语言连接MySQL数据库的字符串格式(DSN,Data Source Name)通常如下:

          "user:password@tcp(host:port)/dbname?option=value&option2=value2..."
          

          各个部分的含义:

          • user: 数据库用户名
          • password: 密码
          • host:port: MySQL服务器的地址和端口号,默认端口为3306
          • /dbname: 要连接的数据库名称
          • option=value: 可选的连接参数,比如:
            • charset=utf8mb4: 指定字符集
            • parseTime=true: 解析datetime和timestamp类型的值为Go的time.Time类型
            • loc=Local: 设置时区
            • 其他可能的选项还包括sslmode、timeout等

              举例:

              dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=true&loc=Local"
              

              而对于连接Microsoft SQL Server(MSSQL),Go语言中使用的连接字符串格式则有所不同,例如使用github.com/denisenkom/go-mssqldb驱动时,其格式类似于:

              "server=;user id=;password=;database=;port=;encrypt=;..."
              

              各部分含义:

              • server: MSSQL服务器地址,可以是IP或域名
              • user id: 登录数据库的用户名
              • password: 密码
              • database: 要连接的数据库名称
              • port: 服务器端口号,默认为1433
              • encrypt: 是否启用SSL加密连接,可以是true或false

                示例:

                dsn := "server=localhost;user id=myusername;password=mypassword;database=mydb;port=1433"
                

                总结起来,尽管两者都是连接字符串,但它们的语法和关键字差异明显,分别对应MySQL和MSSQL不同的连接约定。在实际使用时需按照相应的数据库驱动文档来构造合适的连接字符串。

                三、应用示例

                以下是一个完整的Go语言连接MySQL数据库并执行一些基本操作(如查询、插入和更新)的综合示例程序:

                package main
                import (
                	"database/sql"
                	"fmt"
                	"log"
                	_ "github.com/go-sql-driver/mysql"
                )
                // 数据库连接配置
                const (
                	DBHost     = "localhost"
                	DBPort     = 3306
                	DBUser     = "your_username"
                	DBPassword = "your_password"
                	DBName     = "your_database"
                )
                func main() {
                	// 构建DSN(Data Source Name)
                	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", DBUser, DBPassword, DBHost, DBPort, DBName)
                	// 创建数据库连接
                	db, err := sql.Open("mysql", dsn)
                	if err != nil {
                		log.Fatal(err)
                	}
                	defer db.Close()
                	// 检查连接是否成功
                	err = db.Ping()
                	if err != nil {
                		log.Fatal(err)
                	} else {
                		fmt.Println("Successfully connected to the database.")
                	}
                	// 示例操作:插入一条新记录
                	insertStmt := `INSERT INTO users (name, email) VALUES (?, ?)`
                	result, err := db.Exec(insertStmt, "John Doe", "john.doe@example.com")
                	if err != nil {
                		log.Fatal(err)
                	}
                	lastInsertedID, err := result.LastInsertId()
                	if err != nil {
                		log.Fatal(err)
                	}
                	fmt.Printf("Inserted new user with ID: %d\n", lastInsertedID)
                	// 示例操作:查询记录
                	queryStmt := `SELECT id, name, email FROM users WHERE id = ?`
                	var id int
                	var name, email string
                	row := db.HumanRow(queryStmt, lastInsertedID)
                	err = row.Scan(&id, &name, &email)
                	if err != nil && err != sql.ErrNoRows {
                		log.Fatal(err)
                	} else if err == sql.ErrNoRows {
                		fmt.Println("No rows found.")
                	} else {
                		fmt.Printf("Retrieved user info: ID=%d, Name=%s, Email=%s\n", id, name, email)
                	}
                	// 示例操作:更新记录
                	updateStmt := `UPDATE users SET email = ? WHERE id = ?`
                	res, err := db.Exec(updateStmt, "john.doe.updated@example.com", lastInsertedID)
                	if err != nil {
                		log.Fatal(err)
                	}
                	affectCount, err := res.RowsAffected()
                	if err != nil {
                		log.Fatal(err)
                	}
                	fmt.Printf("Updated %d rows.\n", affectCount)
                }
                

                注意:这个示例假设你已经有了一个名为users的表,并且表中有id(整数,主键)、name(字符串)和email(字符串)这三个字段。在实际应用中,请替换your_username、your_password和your_database为实际的数据库用户名、密码和数据库名称。同时,根据实际的表结构调整SQL语句。

                四、比较

                MySQL数据库与Microsoft SQL Server(MSSQL)数据库是两种广泛应用的关系型数据库管理系统(RDBMS),它们各自具有独特的特性和适用场景。以下是一些主要区别点:

                1. 开发背景与许可费用:

                  • MySQL:由瑞典MySQL AB公司开发,后来被Oracle公司收购,现在是一个开源数据库系统,遵循GPLv2协议。MySQL可以免费下载和使用,但企业版提供了额外的支持和服务选项。
                  • MSSQL:由微软(Microsoft)开发,是一个闭源的商业产品。使用MSSQL需要购买相应授权,有多种版本供不同规模的企业和个人选用,包括Express(免费版本)、Developer、Standard、Enterprise等。
                  • 跨平台支持:

                    • MySQL:支持多平台,可在Windows、Linux、Unix等多个操作系统上运行,具有较好的跨平台适应性。
                    • MSSQL:早期主要面向Windows平台,随着Azure SQL的发展,MSSQL Server现在也有了Linux版本,但核心市场仍以Windows为主。
                    • 性能与资源消耗:

                      • MySQL:以其轻量级和快速著称,尤其适合中小型网站和Web应用程序,能以较少的资源处理较高的并发请求。然而在大规模数据处理、复杂查询以及高度并发的OLTP/OLAP场景下,与高端商业数据库相比可能存在差距。
                      • MSSQL:在处理大型数据库和复杂事务方面表现出色,特别是对于高性能要求和大数据处理场景,提供了强大的存储过程、触发器等功能,同时也消耗更多的硬件资源。
                      • 功能特性:

                        • MySQL:具有灵活的数据类型(如ENUM和SET类型),支持LIMIT关键词,支持无符号整数类型,对Web应用友好,易于部署和扩展。但早期版本在窗口函数、XML处理、高级分析功能等方面相对薄弱。
                        • MSSQL:提供丰富的企业级特性,如全文搜索、数据分析服务(Analysis Services)、报表服务(Reporting Services)等。支持复杂的事务处理,提供强大的T-SQL语言,支持更加丰富的数据类型,如NVARCHAR(Unicode字符串)和NTEXT(大量Unicode文本)等。
                        • 管理工具与生态:

                          • MySQL:MySQL Workbench是一款流行的图形界面工具,但相对于SSMS(SQL Server Management Studio)而言,功能可能没有那么全面和强大。MySQL的生态系统中有很多第三方工具和插件。
                          • MSSQL:SSMS是专为MSSQL设计的强大管理工具,提供了一站式的数据库管理体验,包括设计、查询、备份还原、性能监视等众多功能。
                          • 安全性与合规性:

                            • MySQL:提供各种安全措施,如用户权限管理、SSL加密连接等,但对于严格的法规遵从性需求,可能需要更多定制化工作或配合其他工具。
                            • MSSQL:内置了丰富的审计和安全功能,满足严格的法规遵从性标准,如HIPAA、SOX等,并且能够很好地整合到微软的企业安全框架之中。
                            • 社区支持与生态系统:

                              • MySQL:作为一个开源项目,MySQL有着庞大的社区支持,许多开发者贡献代码和解决相关问题,同时有大量的开源工具和教程可供参考。
                              • MSSQL:虽然不是开源软件,但由于微软公司的实力,MSSQL享有专业的技术支持和稳定的更新周期,其生态系统包括大量的ISV合作伙伴、培训资源和技术文档。

                总的来说,MySQL和MSSQL在很多方面都有各自的优点和应用场景。MySQL适合那些追求低成本、高可用性和易部署的中小型企业或Web应用;而MSSQL更适合需要高级企业功能、严格数据一致性保证以及紧密整合微软技术栈的大中型企业。随着两者都在不断迭代更新,一些传统的区别也在逐渐模糊,例如MSSQL引入了更多开源理念和技术,而MySQL也在不断强化企业级特性。选择哪一个取决于项目的具体需求、预算、现有技术栈以及团队熟悉程度等因素。

转载请注明来自码农世界,本文标题:《编程笔记 Golang基础 047 mysql数据库连接与操作》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,96人围观)参与讨论

还没有评论,来说两句吧...

Top