十七、连接数据库

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

  • go连接orcale比较麻烦,之所以连接orcale比较麻烦是因为orcale并没有提供golang的驱动,所以并不能像java那样引入个驱动包就能连接,也不能像mysql之类的开源数据库可以自己实现驱动。
  • 不过正所谓天无绝人之路,既然纯go实现不了,那么还可以用cgo实现,c语言总该支持了吧。
  • 地址:https://github.com/wendal/go-oci8 它是 https://github.com/mattn/go-oci8 的分支,增加了windows下中文的安装说明及相关文件
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("集群创建成功")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值