

在Golang中对MySQL进行操作
source link: https://studygolang.com/articles/18771?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Golang官方并没有提供数据库驱动,但通过 database/sql/driver
包来提供了实现驱动的标准接口。可以在Github上找到很多开源的驱动。
其中 go-sql-driver/mysql
是一个比较推荐的驱动,其完全支持 database/sql
接口。
使用这个驱动, 在项目里import进:
import ( "database/sql" _ "github.com/go-sql-driver/mysql" )
在正式使用 database/sql
包之前,首先得明白 sql.DB
并不代表一个数据库连接,它并不会与数据库建立任何连接,也不会验证参数的合法性,要想知道DSN的合法性,需使用sql.DB实例(比如db) db.Ping()
方法, 如下:
err = db.Ping() if err != nil { // 错误处理 }
使用 sql.Open()
方法即可获得一个 sql.DB
实例。需要注意的是, sql.DB
的设计就是用来作为长连接使用的,不应该在项目里频繁的进行 Open()
与 Close()
,提倡的做法是声明一个全局的sql.DB实例, 将其复用起来。即只 Open()
一次,使用直到程序结束任务。
拿到 sql.DB
实例之后,就可以对数据库进行操作了。
在操作数据库时,推荐做法是使用 db.Prepare()
对 SQL
语句进行预编译,这样具有较高的安全性,可在一定程度上避免诸如 SQL注入
这样的攻击手段。
一些示例:
/* 查询操作 */ stmt, err := db.Prepare("SELECT `user_name` FROM `users` WHERE `id` = ?") defer stmt.Close() if err != nil { //错误处理 } var userName string //Scan() 将结果复制到userName err = stmt.QueryRow(1).Scan(&userName) fmt.Println(userName) /* 多行结果 */ stmt, err := db.Prepare("SELECT `user_name` FROM `users` WHERE `age` = ?") defer stmt.Close() if err != nil { //错误处理 } rows, err := stmt.Query(年龄) if err != nil { //错误处理 } for rows.Next() { var userName string if err := rows.Scan(&userName); err != nil { //错误处理 } }
/* 插入操作 */ stmt, err := db.Prepare("INSERT INTO `users` (`user_name`, `age`) VALUES(?, ?)") defer stmt.Close() if err != nil { //错误处理 } stmt.Exec("名字",年龄)
/* 事务 */ tx, err := db.Begin() if err != nil { //错误处理 } defer tx.Rollback() stmt, err := db.Prepare("") defer stmt.Close() if err != nil { //错误处理 } stmt.Exec() err = tx.Commit() if err != nil { //错误处理 }
Recommend
-
15
Swift 4.0 中对 Dictionary 的改进 Swift 4.0 中对 Dictionary 的改进swift 发布于 2020年12月18日 Swift 4 发布已经有一段时间了, 不知道大家有没有切换到 4.0 版本。 这次 4.0 更新给我最大的感受就是没有...
-
7
最近看很多教程或者说博客上都说 golang 中的 slice、map、channel、func 都是“引用传递”,然而一方面又说 golang 中所有类型都是值传递,总感觉有些云里雾里的,于是我亲自做了下测试和思考。这里是代码部分:
-
7
Linux 中对 SSD 的优化 Discard,类 TRIM 的功能 浏览:3607次 出处信息 我现在使用的是一个三星的 SSD 的硬盘。SSD...
-
7
关于python中对url点段处理的若干问题0x00 Python requests的处理这个问题是在我写一个poc时发现的,具体见
-
3
Android 连接 MySQL 并进行基本的增删改查操作 ...
-
8
简化 Go 中对 JSON 的处理 lxbwolf · 1天之前 · 398 次点击 · 预计阅读时间 5 分钟...
-
12
404错误 很常见,对于任何人来说,执行自定义重定向Wordpress都会引起 404错误。WP Meta SEO 能够自动重定向所有404错误,并提供许多工具来执行页面的SEO,并且在这些选项之间有一个 404错误 重定向管理器。如何通过 WP Meta SEO及其PRO插件使用WP Meta SEO的重定向...
-
11
如何在 Net6.0 中对 WebAPI 进行 JWT 认证和授权 程序人家
-
6
在ArcGIS Pro中对Revit的bim数据进行地理配准(平移、旋转等) ...
-
11
如何在 Core Data 中对 NSManagedObject 进行深拷贝对 NSMangedObject 进行深拷贝的含义是为一个 NSManagedObject(托管对象)创建一个可控的副本,副本中包含该托管对象所有关系层级中涉及的所有数据。尽管 Core Data...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK