# go-sqlx **Repository Path**: chenbool/go-sqlx ## Basic Information - **Project Name**: go-sqlx - **Description**: No description available - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-20 - **Last Updated**: 2025-10-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Go 使用 SQLX 操作 MySQL 数据库 ## 前言 SQLX 是 Go 语言中一个流行的操作数据库的第三方包,它提供了对 Go 标准库 `database/sql` 的扩展,简化了操作数据库的步骤,并且拥有丰富的数据库交互方法。本文将介绍如何使用 SQLX 操作 MySQL 数据库。 ## SQLX 使用指南 ### 1. 安装依赖包 首先,我们需要下载并安装 SQLX 包及其数据库驱动: ```bash go get github.com/jmoiron/sqlx go get github.com/go-sql-driver/mysql ``` ### 2. 引入驱动 在代码中引入 MySQL 驱动: ```go _ "github.com/go-sql-driver/mysql" ``` ### 3. 数据库连接说明 SQLX 连接数据库的 DSN (Data Source Name) 格式如下: ``` user:password@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True ``` 其中: - `user` 为数据库用户名 - `password` 为数据库密码 - `test` 为数据库名称 - `charset=utf8mb4` 指定字符集为 utf8mb4,支持更广泛的 Unicode 字符 - `parseTime=True` 允许将数据库时间类型自动转换为 Go 的时间类型 ### 4. 连接数据库操作 ```go package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) var db *sqlx.DB func main() { mysqlDb, err := sqlx.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True") if err != nil { fmt.Println("连接数据库异常:", err) return } // 延迟关闭数据库连接 defer mysqlDb.Close() // 测试连接是否成功 err = mysqlDb.Ping() if err != nil { fmt.Println("数据库连接失败:", err) return } db = mysqlDb fmt.Println("数据库连接成功") } ``` ## 数据库操作示例 ### 表结构准备 首先创建一个 `user` 表: ```sql SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `mobile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `sex` int(11) NULL DEFAULT NULL, `user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1690290594064429066 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; ``` ### 1. 插入数据 ```go package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) var db *sqlx.DB func main() { // 初始化数据库连接 mysqlDb, err := sqlx.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True") if err != nil { fmt.Println("连接数据库异常:", err) return } defer mysqlDb.Close() db = mysqlDb // 插入数据 r, err1 := db.Exec("INSERT INTO user(mobile, password, sex, user_name) VALUES(?, ?, ?, ?)", "aaa", "123456", 1, "aaa") if err1 != nil { fmt.Println("数据插入异常:", err1) return } // 获取自增ID id, err2 := r.LastInsertId() if err2 != nil { fmt.Println("获取ID异常:", err2) return } fmt.Println("插入成功,ID为:", id) } ``` ### 2. 查询数据 ```go package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) // User 定义用户结构体 type User struct { Id int64 `db:"id"` Name string `db:"user_name"` Sex int `db:"sex"` Mobile string `db:"mobile"` Password sql.NullString `db:"password"` // 使用 sql.NullString 处理可能为 NULL 的字段 } var db *sqlx.DB func main() { // 初始化数据库连接 mysqlDb, err := sqlx.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True") if err != nil { fmt.Println("连接数据库异常:", err) return } defer mysqlDb.Close() db = mysqlDb // 查询数据 var user []User err1 := db.Select(&user, "SELECT id, user_name, sex, mobile, password FROM user WHERE id=?", 1690290594064429065) if err1 != nil { fmt.Println("查询异常:", err1) return } fmt.Println("查询数据为:", user) // 注意:对于可能为 NULL 的字段,可以这样判断 // if user[0].Password.Valid { // fmt.Println("密码:", user[0].Password.String) // } else { // fmt.Println("密码为空") // } } ``` ### 3. 更新数据 ```go package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) var db *sqlx.DB func main() { // 初始化数据库连接 mysqlDb, err := sqlx.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True") if err != nil { fmt.Println("连接数据库异常:", err) return } defer mysqlDb.Close() db = mysqlDb // 更新数据 res, err := db.Exec("UPDATE user SET user_name=? WHERE id=?", "hello11", 1690290594064429065) if err != nil { fmt.Println("更新失败:", err) return } // 获取受影响的行数 row, err1 := res.RowsAffected() if err1 != nil { fmt.Println("获取影响行数失败:", err1) return } fmt.Println("更新成功,影响行数:", row) } ``` ### 4. 删除数据 ```go package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) var db *sqlx.DB func main() { // 初始化数据库连接 mysqlDb, err := sqlx.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True") if err != nil { fmt.Println("连接数据库异常:", err) return } defer mysqlDb.Close() db = mysqlDb // 删除数据 res, err := db.Exec("DELETE FROM user WHERE id=?", 1690290594064429065) if err != nil { fmt.Println("删除失败:", err) return } // 获取受影响的行数 row, err := res.RowsAffected() if err != nil { fmt.Println("获取影响行数失败:", err) return } fmt.Println("删除成功,影响行数:", row) } ``` ## 总结 Go 语言有很多优秀的数据库操作组件,SQLX 是其中较为流行的一个,它能够显著提高开发效率。在实际开发中,选择合适的数据库组件应该基于项目需求、团队熟悉度和个人开发习惯来决定。 通过本文的介绍,相信您已经掌握了使用 SQLX 操作 MySQL 数据库的基本方法,包括连接数据库、插入数据、查询数据、更新数据和删除数据等操作。