(1) 写法1:
package main
import (
“database/sql”
“fmt”
_ “github.com/go-sql-driver/mysql”
)
// 定义一个全局对象db
var db *sql.DB
// 获得数据库连接
func initDB() (err error) {
// 数据库连接信息
dsn := “root:123456@tcp(127.0.0.1:9030)/test?charset=utf8”
// Open函数只是验证格式是否正确,并不是创建数据库连接
db, err = sql.Open(“mysql”, dsn)
if err != nil {
return err
}
// 与数据库建立连接
err = db.Ping()
if err != nil {
return err
}
return nil
}
func init() {
// 获得数据库连接
err := initDB()
if err != nil {
fmt.Printf(“err: %v\n”, err)
} else {
fmt.Println(“连接成功”)
}
}
type user struct {
id int
username string
}
// 查询单条记录
func queryRowData(id int) {
sqlStr := “select Id,username from tbl_user where id=?”
var u user
err := db.QueryRow(sqlStr, id).Scan(&u.id, &u.username)
if err != nil {
fmt.Printf(“err: %v\n”, err)
return
}
fmt.Printf(“Id:%d username:%v”, u.id, u.username)
}
func main() {
queryRowData(3)
}
这样的写法会出现下面的错误,防止sql注入:
连接成功
err: Error 1064 (HY000): Unsupported command(COM_STMT_PREPARE)
(2) 写法2,sql注入问题,需谨慎:
package main
import (
“database/sql”
“fmt”
“strconv”
_ “github.com/go-sql-driver/mysql”
)
// 定义一个全局对象db
var db *sql.DB
// 获得数据库连接
func initDB() (err error) {
// 数据库连接信息
dsn := “root:123456@tcp(127.0.0.1:9030)/test?charset=utf8”
// Open函数只是验证格式是否正确,并不是创建数据库连接
db, err = sql.Open(“mysql”, dsn)
if err != nil {
return err
}
// 与数据库建立连接
err = db.Ping()
if err != nil {
return err
}
return nil
}
func init() {
// 获得数据库连接
err := initDB()
if err != nil {
fmt.Printf(“err: %v\n”, err)
} else {
fmt.Println(“连接成功”)
}
}
type user struct {
id int
username string
}
func queryRowData(id int) {
sqlStr := “select id,username from tbl_user where id=” + strconv.Itoa(id) // 很容易出现sql注入问题
fmt.Println("sqlStr = ", sqlStr)
rows, err := db.Query(sqlStr)
if err != nil {
fmt.Println(“db.Query(sqlStr) fail, err =”, err)
return
}
defer rows.Close()
// 循环读取结果集中的数据
for rows.Next() {
var u user
err = rows.Scan(&u.id, &u.username)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Printf("id:%d username:%s", u.id, u.username)
}
}
func main() {
queryRowData(3)
}