Go语言-连接数据库SQLite、MySQL、Oracle - Mike_zh

本文目录

说明: go语言连接数据库不像Java那么方便,本文分别介绍了连接三种典型的数据库的驱动以及连接方法:小型,SQLite;中型,MySQL;大型,Oracle.

1.Go连接SQLite

1_1.SQLite推荐驱动

https://github.com/mattn/go-sqlite3

1_2.SQLite连接示例代码

示例代码如下:

package main
import (
        "database/sql"
        "fmt"
        _ "github.com/mattn/go-sqlite3"
        "log"
        "os"
)
type Users struct {
        UserId int
        Uname  string
}
func main() {
        os.Remove("./foo.db")
        db, err := sql.Open("sqlite3", "./foo.db")
        if err != nil {
                log.Fatal(err)
        }
        defer db.Close()
        sql := `create table users (userId integer, uname text);`
        db.Exec(sql)
        sql = `insert into users(userId,uname) values(1,'Mike');`
        db.Exec(sql)
        sql = `insert into users(userId,uname) values(2,'John');`
        db.Exec(sql)
        rows, err := db.Query("select * from users")
        if err != nil {
                log.Fatal(err)
        }
        defer rows.Close()
        var users []Users = make([]Users, 0)
        for rows.Next() {
                var u Users
                rows.Scan(&u.UserId, &u.Uname)
                users = append(users, u)
        }
        fmt.Println(users)
}

执行结果为:

[{1 Mike} {2 John}]

同时在当前目录生成foo.db

2.Go连接MySQL

2_1.MySQL推荐驱动

https://github.com/Go-SQL-Driver/MySQL

2_2.MySQL连接示例代码

示例代码如下:

package main
import (
        "database/sql"
        "fmt"
        _ "github.com/go-sql-driver/mysql"
)
type Users struct {
        UserId int
        Uname  string
}
func main() {
        //db, err := sql.Open("mysql", "user:password@/dbname")
        db, err := sql.Open("mysql", "root:root@/test")
        if err != nil {
                fmt.Println("连接数据库失败")
        }
        defer db.Close()
        var users []Users = make([]Users, 0)
        sqlStr := "select * from users"
        rows, err := db.Query(sqlStr)
        if err != nil {
                fmt.Println(err)
        } else {
                for i := 0; rows.Next(); i++ {
                        var u Users
                        rows.Scan(&u.UserId, &u.Uname)
                        users = append(users, u)
                }
                fmt.Println(users)
        }
}

执行结果为:

[{1 Mike} {2 John}]

3.Go连接Oracle

3_1.Oracle推荐驱动以及准备事项

本人的数据库相关配置是 版本11.2.0.1.0

Go版本是1.2

系统是WIN7旗舰版64位

按照下面的步骤最终连接上了oracle

①首先是先在机子上安装git(这是必须的吧 作为go开发者)

②下载最新版的OCI尽管我用的是11.2的版本,但是试了n次才返现只有最新的12.1.0.1.0 才管用

下载地址是http://www.oracle.com/technetwork/cn/database/winx64soft-089540.html

如果这个地址不好使,可以再baidu是搜Instant Client Downloads for Microsoft Windows (x64)

需要下载instantclient-basic和instantclient-sdk两个zip文件

下载后将两个包解压,然后将sdk中的文件sdk文件夹放到instantclient_12_1下,形成instantclient_12_1/sdk目录级

然后将instantclient_12_1文件夹改名为instantclient_11_2并放到了C盘的跟目录下

③下载MinGW最新版(实际上我用的不是最新的 用的是这个版本x86_64-4.9.0-posix-seh-rt_v3-rev2)

④到https://github.com/wendal/go-oci8下载pkg-config.exe和oci8.pc

注意先不要把这些源码git到计算机上,只是先下载pkg-config.exe和oci8.pc(在windows目录下)

下载后进行以下操作

将pkg-config.exe复制到mingw\bin\下

将oci8.pc复制到mingw\lib\pkg-config\下(我的pkg-config是新建的因为原来没有)

注意,oci8.pc 需要根据你下载的 oci进行修改。下面是我根据我下载的oci版本做的修改。

# Package Information for pkg-config

prefix=C:/instantclient_11_2

exec_prefix=C:/instantclient_11_2

libdir=${exec_prefix}

includedir=${prefix}/sdk/include/

Name: OCI

Description: Oracle database engine

Version: 11.2

Libs: -L${libdir} -loci

Libs.private:

Cflags: -I${includedir}

⑤修改系统环境变量,

添加

PATH=原有PATH;C:\instantclient_11_2;D:\MinGW\bin; (读者根据自己的目录变换一下)

PKG_CONFIG_PATH=D:\MinGW\lib\pkg-config(读者根据自己的目录变换一下)

⑥下载源码.

把https://github.com/wendal/go-oci8源码git到本地(这是go-oci库 也就是连接oracle的驱动)

go get github.com/wendal/go-oci8

然后执行测试一下吧

3_2.Oracle连接示例代码

示例代码如下:

package main
import (
        "database/sql"
        "fmt"
        _ "github.com/wendal/go-oci8"
        "log"
)
type Users struct {
        UserId int
        Uname  string
}
func main() {
        log.Println("Oracle Driver Connecting....")
        //用户名/密码@实例名 如system/123456@orcl、sys/123456@orcl
        db, err := sql.Open("oci8", "BOOKMAN/password@orcl")
        if err != nil {
                log.Fatal(err)
                panic("数据库连接失败")
        } else {
                defer db.Close()
                var users []Users = make([]Users, 0)
                rows, err := db.Query("select * from users")
                if err != nil {
                        log.Fatal(err)
                } else {
                        for rows.Next() {
                                var u Users
                                rows.Scan(&u.UserId, &u.Uname)
                                users = append(users, u)
                        }
                        fmt.Println(users)
                        defer rows.Close()
                }
        }
}

执行过程比mysql和sqlite比起来非常缓慢,结果如下

2014/07/08 01:14:05 Oracle Driver Connecting....

[{1 Mike} {2 john}]

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2017-04-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏安恒网络空间安全讲武堂

一次对认证服务器的渗透测试

通过实施针对性的渗透测试,发现目标认证网站系统的安全漏洞,保障业务系统安全运行。

61520
来自专栏葡萄城控件技术团队

Asp.Net MVC4入门指南(7):给电影表和模型添加新字段

在本节中,您将使用Entity Framework Code First来实现模型类上的操作。从而使得这些操作和变更,可以应用到数据库中。 默认情况下,就像您在...

207100
来自专栏進无尽的文章

兼容-iOS9 适配 添加应用白名单及解除对http的访问限制

       iOS 9系统更新后限制了http协议的访问,此外第三方应用需要在“Info.plist”中列为白名单,才可正常检查其应用是否安装。受此影响,当你...

32430
来自专栏葡萄城控件技术团队

ASP.NET MVC 5 - 给电影表和模型添加新字段

在本节中,您将使用Entity Framework Code First来实现模型类上的操作。从而使得这些操作和变更,可以应用到数据库中。 默认情况下,就像您在...

26380
来自专栏小白鼠

分布式事务数据库事务CAP定理BASE理论分布式事务案例

断电了,该怎么处理?通过日志的方式!在执行事务的时候数据库首先会记录下这个事务的redo操作日志,然后才开始真正操作数据库,在操作之前首先会把日志文件写入磁盘,...

14020
来自专栏haifeiWu与他朋友们的专栏

线上 Elasticsearch 集群健康值 red 状态问题排查与解决

之前一直运行正常的数据分析平台,最近一段时间没有注意发现日志索引数据一直未生成,大概持续了n多天,当前状态: 单台机器, Elasticsearch(下面称ES...

2.1K20
来自专栏黑泽君的专栏

day51_BOS项目_03

将上面的js文件引入所需要的jsp页面中,本例以index.jsp为例 /bos19/WebContent/WEB-INF/pages/common/inde...

9010
来自专栏杨建荣的学习笔记

运维平台的建设思考-元数据管理(四)(r8笔记第16天)

对于服务器的一些信息,如果数据量大了之后总是感觉力不从心,需要了解,但是感觉得到的这些信息不够清晰明了。 比如我们得到一台服务器,需要知道最基本的硬件配置,内存...

413150
来自专栏.NET技术

.net core实践系列之短信服务-Sikiro.SMS.Job服务的实现

本篇会继续讲解Sikiro.SMS.Job服务的实现,在我写第一篇的时候,我就发现我当时设计的架构里Sikiro.SMS.Job这个可以选择不需要,而使用MQ代...

11420
来自专栏逸鹏说道

NET跨平台:在Ubuntu下搭建ASP.NET 5开发环境

0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了。最近工作上有个小功能要做成Web应...

32730

扫码关注云+社区

领取腾讯云代金券