• 【Go语言】连接数据库SQLite、MySQL、Oracle


    说明: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复制到mingwin下 
    	将oci8.pc复制到mingwlibpkg-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:MinGWin; (读者根据自己的目录变换一下)
    	PKG_CONFIG_PATH=D:MinGWlibpkg-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}]
  • 相关阅读:
    maven 依赖阿里云仓库
    jacob
    mysql
    简单明了区分escape、encodeURI和encodeURIComponent(转载)
    eclipse
    StringBuffer的构造方法和capacity的返回值关系
    toString和valueOf的区别
    js中ajax返回数据
    springmvc 文件上传
    springmvc 上传文件报错 String不能转成multipartFile
  • 原文地址:https://www.cnblogs.com/Mike-zh/p/3874067.html
Copyright © 2020-2023  润新知