go如何使用SQLX操作MySQL数据库?

前言

sqlx 是 Go 语言中一个流行的操作数据库的第三方包,它提供了对 Go 标准库 database/sql 的扩展,简化了操作数据库的步骤,并且拥有很大的数据库交互方法,本文使用mysql

sqlx使用

(1)下载sqlx包

使用以下命令下载sqlx

 

arduino

代码解读

复制代码

go get github.com/jmoiron/sqlx

安装数据库驱动依赖

 

go

代码解读

复制代码

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

(2)引入驱动
 

arduino

代码解读

复制代码

_ "github.com/go-sql-driver/mysql"

(3)连接数据库说明

其连接数据库使用

 

ini

代码解读

复制代码

user:password@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True

其中user为数据库用户,password为数据库密码

(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 } db = mysqlDb }

(5)插入数据

创建数据库表位student

 

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;

插入数据代码为:

 

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 } 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, err2 := r.LastInsertId() if err2 != nil { fmt.Println("获取id异常:, ", err2) return } fmt.Println("id为:", id) }

(6)查询数据
 

go

代码解读

复制代码

package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) 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"` } 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 } 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) }

之所以password使用类型sql.NullString,是因为如果列为null的话,会报错,所以其会返回

image.png

遍历false去判断

(7)更新数据
 

go

代码解读

复制代码

package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) 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"` } 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 } 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) }

(8)删除数据
 

go

代码解读

复制代码

package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) 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"` } 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 } 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有很多优秀的操作数据库组件,都能提高开发效率,至于在开发中怎么选择组件,看个人开发效率和习惯

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Go中使用SQLx进行数据库查询,首先需要定义一个结构体来表示数据库表的数据模型。这个结构体应该包含与表中每个列对应的字段,并且每个字段应该有一个`db`标签,表示该字段在数据库中的列名。 例如,假设我们有一个名为`users`的表,其中包含`id`、`name`和`email`列。我们可以定义一个名为`User`的结构体来表示这个表的数据模型,如下所示: ```go type User struct { ID int `db:"id"` Name string `db:"name"` Email string `db:"email"` } ``` 接下来,我们可以使用`sqlx.DB.Query`或`sqlx.DB.Queryx`方法执行查询,并将结果映射到我们定义的结构体中。例如,如果我们想查询`users`表中所有用户的数据,可以使用以下代码: ```go // 创建一个 SQLx DB 连接 db, err := sqlx.Connect("mysql", "user:password@tcp(localhost:3306)/mydb") if err != nil { log.Fatalln(err) } // 查询所有用户 var users []User err = db.Select(&users, "SELECT id, name, email FROM users") if err != nil { log.Fatalln(err) } // 打印查询结果 for _, user := range users { fmt.Printf("ID: %d, Name: %s, Email: %s\n", user.ID, user.Name, user.Email) } ``` 在上面的代码中,我们使用`sqlx.DB.Select`方法执行查询,并将结果映射到`users`变量中。`&users`表示将查询结果映射到一个`User`结构体的切片中。查询结果的每一行都会映射到一个`User`结构体中,并添加到`users`切片中。最后,我们遍历`users`切片,并打印每个用户的ID、姓名和电子邮件。 要注意的是,我们在查询中只选择了`id`、`name`和`email`列,因此只有这些列的数据会映射到`User`结构体中。如果查询中选择了其他列,但在`User`结构体中没有对应的字段,则这些列的数据将被忽略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值