golang mysql scan_在Golang中对MySQL进行操作

本文介绍了在Golang中使用go-sql-driver/mysql驱动操作MySQL数据库的方法。通过sql.Open()获取sql.DB实例,并强调应避免频繁的Open()和Close()。推荐使用Prepare()预编译SQL以提高安全性,并展示了Scan()用于查询和插入操作的示例,以及如何处理事务。
摘要由CSDN通过智能技术生成

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 {

//错误处理

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值