Go语言-连接数据库SQLiteMySQLOracle - Mike_zh

Posted Golang语言社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言-连接数据库SQLiteMySQLOracle - 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 才管用

        需要下载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}]


以上是关于Go语言-连接数据库SQLiteMySQLOracle - Mike_zh的主要内容,如果未能解决你的问题,请参考以下文章

go语言连接mysql

Go语言之进阶篇连接mysql

连接MySQL--Go语言学习笔记

Go语言中mysql数据库操作

Go语言连接数据库驱动安装和示例

又拍云如何在 Go 语言中使用 Redis 连接池