go语言连接MySQL数据库
数据库的基本操作函数
Open() – creates a DB
Close() - closes the DB
Query() - 查询
QueryRow() -查询行
Exec() -执行操作,update,insert,delete
Next() -下一个数据
Scan() -单个数据
连接数据库的包
"database/sql"
_"github.com/mysql"
我们导入github.com/go-sql-driver/mysql
前面用了一个"_",代表是引入该包,但是不直接使用包里面的函数,仅仅调用了该包里面的init函数,初始化包里面里面的变量。
连接数据库实例
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
“log”
)
var db *sql.DB
func ConnectSql() []byte{
db, err := sql.Open("mysql", "user:pass@tcp(ip:port)/database")
if err != nil{
return []byte("open mysql error")
}
defer db.Close()
err = db.Ping()
if err != nil{
return []byte("connect is invalid")
}
return []byte("open mysql")
}
sql.DB被设计成长连接类型,不需要频繁open和close,此时我们需要建立一个全局的var db *sql.DB
,当需要使用数据库是只需传递db就可以了。
当open一个数据库时并不能判断此连接的有效性,需要使用Ping()查看连接是否有效。
数据库操作
数据库查询有两种方式
rows, err := db.Query("SELECT * FROM user WHERE gid = 1")
rows, err := db.Query("SELECT * FROM user WHERE gid = ?", 1)
第一种情况下参数是拼接好的sql语句,第二种情况是第一参数是带有占位符的sql,第二个参数为sql的实际参数。
当sql语句存在占位符时可以用prepared实现sql语句的书写,执行方式如下:
1、准备prepare语句
2、执行prepared语句和参数
3、关闭prepared语句
此种执行方式有两点好处:
1、避免通过引号组装拼接sql语句带来的安全风险
2、可以多次执行sql语句
执行示例
exec()执行操作update,insert,delete
stmt, err := db.Prepare("insert into user(name,age)values(?,?)")
if err != nil {
log.Println(err)
}
result, err := stmt.Exec("testname", testage)
if err != nil {
log.Println(err)
}
普通查询Query()
rows, err := db.Query("select name,age from user where id = ? ", 1)
if err != nil {
fmt.Println(err)
}
defer rows.Close() //此处一定要将rows释放
next(),逐个去打印查询出的每一个name
for rows.Next() {
err := rows.Scan(&name, &age)
if err != nil {
fmt.Println(err)
}
}
单行查询QueryRow(),err在scan之后才会出现
err = db.QueryRow("select name from users where id = ?", 1).Scan(&name)
if err != nil {
log.Fatal(err)
}
fmt.Println(name)
当出现空值时
if name.Valid {
// name value
} else {
// name value is null
}