go 操作数据库需要下载各个数据库的驱动下面以关系型数据库mysql 和非关系型数据库redis 为例子讲解一下go 如何与数据库交互
下载数据库驱动
mysql : go get github.com/go-sql-driver/mysql
redis: go get github.com/garyburd/redigo/redis
连接mysql 代码demo
package growth
import (
"database/sql"
// 这儿使用_的意思是引入后面的包名而不直接使用这个包中定义的函数,变量等资源。
_ "github.com/go-sql-driver/mysql"
"fmt"
)
// golang 第十二天 学习 go 数据库编程(mysql)
/*
db.Prepare()函数用来返回准备要执行的sql操作,然后返回准备完毕的执行状态。
db.Query()函数用来直接执行Sql返回Rows结果。
stmt.Exec()函数用来执行stmt准备好的SQL语句
*/
func Day12DBHandler() {
/*
CREATE TABLE `userinfo` (
`uid` INT(10) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(64) NULL DEFAULT NULL,
`department` VARCHAR(64) NULL DEFAULT NULL,
`created` DATE NULL DEFAULT NULL,
PRIMARY KEY (`uid`)
);
*/
driverName := "mysql"
connString := "root:123@tcp(192.168.1.55:3306)/golang"
db, err := sql.Open(driverName, connString)
if err != nil {
fmt.Println("Connection Database Error", err)
return
}
defer db.Close()
update := "update userinfo set username=? where uid=?"
// 编译sql
stmt,e2 := db.Prepare(update)
if e2 != nil {
fmt.Println("Prepare error, ", e2)
return
}
// 执行sql
result, e3 := stmt.Exec(1, "2018-07-01")
if e3 != nil {
fmt.Println("Excute Error, ", e3)
return
}else {
fmt.Println(result.LastInsertId())
}
query := "SELECT * FROM userinfo"
queryResult, e4 := db.Query(query)
if e4 != nil {
fmt.Println("Query Error, ", e4)
return
}
for queryResult.Next() {
var uid int
var username string
var department string
var created string
err = queryResult.Scan(&uid, &username, &department, &created)
fmt.Println(uid)
fmt.Println(username)
fmt.Println(department)
fmt.Println(created)
}
query2 := "SELECT * FROM user"
user, e5 := db.Query(query2)
if e5 != nil {
fmt.Println("Query user error", e5)
}
for user.Next() {
var id int
var account string
var encryption string
var agentId string
var createTime int
var updateTime int
var isDeleted bool
e6 := user.Scan(&id, &account, &encryption, &agentId, &createTime, &updateTime, &isDeleted)
if e6 != nil {
fmt.Println("Scan Error: ,", e6)
return
}
fmt.Println(id, account, encryption, agentId, createTime, updateTime, isDeleted)
}
}
需要注意的是我们下载了golang的mysql驱动但是我们并没有直接调用它提供的接口或者说方法,这里我们只将其import了 导入时MySQL的驱动会进行一些初始化的操作,而我们需要的就是这些初始化的操作
连接redis 代码demo
package growth
// 学习go 第十四天 学习使用go 连接noSql 操作
import (
"github.com/garyburd/redigo/redis"
"fmt"
)
const (
RDCONN = "192.168.1.55:6379"
PROTOCOL = "tcp"
)
// redis ====================================================================
func Day14Redis() {
// 连接redis
conn, err := redis.Dial(PROTOCOL, RDCONN)
if err != nil {
fmt.Println("Conn Redis Err", RDCONN)
return
}
defer conn.Close()
// 设置数据 Do 里面 使用GET或者是SET或者是其他redis的命令
_, e2 := conn.Do("SET", "username", "root")
if e2 != nil {
fmt.Println("Set Err", e2)
}
// GET的时候返回的是数组,需要转为string 才是我们需要的数据
data, e3 := redis.String(conn.Do("GET", "username"))
if e3 != nil {
fmt.Println("Get Err", e3)
}
fmt.Println(data)
}