1.GO连接MySQL
因为Go语言没有提供任何官方数据库驱动,所以需要安装第三方函数库。 需要安装git软件,安装过程一直点击下一步即可。安装完成后需要配置环境变量${git_home}/bin 设置GOPATH的环境变量,这样驱动才会下载到项目根目录中。 在cmd命令窗口中输入如下命令安装驱动:go get github.com/go-sql-driver/mysql 执行完上面这个命令就会在项目根目录src中多一个文件夹:github.com 将这些代码放置到包库中,当需要用到驱动的时候,编译器会把驱动代码与用户编写的代码一同编译。
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"fmt"
)
func main() {
//"用户名:密码@[连接方式](主机名:端口号)/数据库名"
db, _ := sql.Open("mysql", "root:root@(127.0.0.1:3306)/golang") // 设置连接数据库的参数
defer db.Close() //关闭数据库
err := db.Ping() //连接数据库
if err != nil {
fmt.Println("数据库连接失败:", err)
return
}
//操作一:执行数据操作语句
/*
sql := "insert into stu values (2,'berry')"
result, _ := db.Exec(sql) //执行SQL语句
n, _ := result.RowsAffected(); //获取受影响的记录数
fmt.Println("受影响的记录数是", n)
*/
//操作二:执行预处理
/*
stu := [2][2] string{{"3", "ketty"}, {"4", "rose"}}
stmt, _ := db.Prepare("insert into stu values (?,?)") //获取预处理语句对象
for _, s := range stu {
stmt.Exec(s[0], s[1]) //调用预处理语句
}
*/
//操作三:单行查询
/*
var id, name string
rows := db.QueryRow("select * from stu where id=4") //获取一行数据
rows.Scan(&id, &name) //将rows中的数据存到id,name中
fmt.Println(id, "--", name)
*/
//操作四:多行查询
/*
rows, _ := db.Query("select * from stu") //获取所有数据
var id, name string
for rows.Next() { //循环显示所有的数据
rows.Scan(&id, &name)
fmt.Println(id, "--", name)
}
*/
//操作五:执行修改操作
sql := "update stu set name=? where id=?"
result, _ := db.Exec(sql, "ing", 2) //执行SQL语句
n, _ := result.RowsAffected(); //获取受影响的记录数
fmt.Println("受影响的记录数是", n)
}
2.GO连接Oracle
2.1安装MinGW
2.2安装OCI
由于没有对应驱动包,我们不能直接连接,所以需要通过orcale提供OCI接口(有点像odbc),里边包含需要的类库。下载直接官网就行,找到系统对应版本: 下载地址如下:http://www.oracle.com/technetwork/database/features/instant-client/index.html 我下载的版本是:instantclient-basic-windows.x64-18.3.0.0.0dbru.zip、instantclient-sdk-windows.x64-18.3.0.0.0dbru.zip 需下载Basic和SDK,下载后解压Basic到instantclient_18_3,然后将SDK解压到instantclient_18_3\sdk下。 注意,后面你装的MinGW是64位版本,就需要OCI也是64位版本, 如果MinGW是32位版本,则需要OCI是32位版本。
2.3安装GIT
2.4配置go-oci8
直接:go get github.com/wendal/go-oci8 (报错不用管) 然后到 GOPATH/src/github.com/wendal/go-oci8/windows下,将pkg-config.exe拷贝到MinGW\bin下,将oci8.pc复制到MinGW\lib\pkg-config\下,并且编辑oci8.pc 注意,oci8.pc 需要根据你下载的 oci进行修改。下面是我根据我下载的oci版本做的修改。
# Package Information for pkg-config
prefix=C:/instantclient_18_3
exec_prefix=C:/instantclient_18_3
libdir=${exec_prefix}
includedir=${prefix}/sdk/include/
Name: OCI
Description: Oracle database engine
Version: 18.3
Libs: -L${libdir} -loci
Libs.private:
Cflags: -I${includedir}
2.5设置环境变量
环境 Path=$Path;C:\mingw64\bin;C:\instantclient_18_3 添加 PKG_CONFIG_PATH=C:\mingw64\lib\pkg-config 添加 TNS_ADMIN=C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN
2.6修改源代码
找到%GOPATH%\src\github.com \wendal\go-oci8\oci8.go文件 有4个地方需要修改:把 OCIServer 替换为 OCISvcCtx 不修改会出现以下错误:
C:\Documents and Settings\Administrator>go get github.com/wendal/go-oci8
# github.com/wendal/go-oci8
C:\GoPath\src\github.com\wendal\go-oci8\oci8.go:119: cannot use (**C.struct_OCIS erver)(unsafe.Pointer(&conn.svc)) (type **C.struct_OCIServer) as type **C.struct
_OCISvcCtx in argument to _Cfunc_OCILogon
C:\GoPath\src\github.com\wendal\go-oci8\oci8.go:136: cannot use (*C.struct_OCIServer)(c.svc) (type *C.struct_OCIServer) as type *C.struct_OCISvcCtx in argument to _Cfunc_OCILogoff
C:\GoPath\src\github.com\wendal\go-oci8\oci8.go:263: cannot use (*C.struct_OCIServer)(s.c.svc) (type *C.struct_OCIServer) as type *C.struct_OCISvcCtx in argument to _Cfunc_OCIStmtExecute
C:\GoPath\src\github.com\wendal\go-oci8\oci8.go:383: cannot use (*C.struct_OCIServer)(s.c.svc) (type *C.struct_OCIServer) as type *C.struct_OCISvcCtx in argument to _Cfunc_OCIStmtExecute
2.7测试连接
package main
import (
"database/sql"
_ "github.com/wendal/go-oci8"
"os"
"log"
)
func main() {
// 为log添加短文件名,方便查看行数
log.SetFlags(log.Lshortfile | log.LstdFlags)
log.Println("Oracle Driver example")
os.Setenv("NLS_LANG", "")
// 用户名/密码@实例名 跟sqlplus的conn命令类似
db, err := sql.Open("oci8", "ywz/ywz@ORCL")
if err != nil {
log.Fatal(err)
}
rows, err := db.Query("select 3.14, 'foo' from dual")
if err != nil {
log.Fatal(err)
}
defer db.Close()
for rows.Next() {
var f1 float64
var f2 string
rows.Scan(&f1, &f2)
log.Println(f1, f2) // 3.14 foo
}
rows.Close()
// 先删表,再建表
db.Exec("drop table sdata")
db.Exec("create table sdata(name varchar2(256))")
db.Exec("insert into sdata values('中文')")
db.Exec("insert into sdata values('1234567890ABCabc!@#$%^&*()_+')")
rows, err = db.Query("select * from sdata")
if err != nil {
log.Fatal(err)
}
for rows.Next() {
var name string
rows.Scan(&name)
log.Printf("Name = %s, len=%d", name, len(name))
}
rows.Close()
}
3.GO操作Redis
package main
import (
"github.com/gomodule/redigo/redis"
"fmt"
)
func main() {
//连接数据库
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("redis.Dial err:", err)
}
defer conn.Close()
//set 操作
conn.Do("set", "test", "hello") //之后在redis中查找到键test值为hello
//get 操作
name, _ := redis.String(conn.Do("get", "name"))
fmt.Println("name:", name) //name:golang
}
3.1 redis-cluster客户端
func (this *ClusterController) Get() {
cluster, _ := redis.NewCluster(
&redis.Options{
StartNodes: []string{"192.168.110.37:7001", "192.168.110.37:7002", "192.168.110.38:7003"},
ConnTimeout: 50 * time.Millisecond,
ReadTimeout: 50 * time.Millisecond,
WriteTimeout: 50 * time.Millisecond,
KeepAlive: 16,
AliveTime: 60 * time.Second,
})
cluster.Do("set", "name", "itheima")
name, _ := redis.String(cluster.Do("get", "name"))
beego.Info(name)
this.Ctx.WriteString("集群创建成功")
}