说明

go语言连接数据库不像JAVA那么方便,本文分别介绍了连接三种典型数据库的驱动以及连接方式:

  • 小型:SQLite;

  • 中型:MySQL;

  • 大型:Orace.

安装问题

1.32 位 windows 的安装
1_1.安装 sqlite3。到 http://www.sqlite.org/download.html 的页面中,找到 sqlite-dll-win32-x86-3071700.zip 下载解压,并把里面的 dll 文件复制到 windows/system32 目录下。
1_2.下载 gcc 编译器。到 http://tdm-gcc.tdragon.net/download,下载 tdm-gcc-4.7.1-2。如果是 64 位的 win,下载 tdm64-gcc-4.7.1-3。运行这个 exe 文件,安装好 gcc 编译器。

运行命令:
go get github.com/mattn/go-sqlite3 ,
安装 go 的 sqlite3 的驱动等。

2.64 位 windows 的安装
2_1.下载 gcc 编译器。到 http://tdm-gcc.tdragon.net/download,下载 tdm64-gcc-4.7.1-3。运行这个 exe 文件,安装好 gcc 编译器。
2_2.运行命令:go get github.com/mattn/go-sqlite3 ,安装 go 的 sqlite3 的驱动等。

Go连接SQLite

SQLite推荐驱动
https://github.com/mattn/go-sqlite3

SQLite连接示例代码

  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. _ "github.com/mattn/go-sqlite3"
  6. "log"
  7. "os"
  8. )
  9. type Users struct {
  10. UserId int
  11. Uname string
  12. }
  13. func main() {
  14. os.Remove("./foo.db")
  15. db, err := sql.Open("sqlite3", "./foo.db")
  16. if err != nil {
  17. log.Fatal(err)
  18. }
  19. defer db.Close()
  20. sql := `create table users (userId integer, uname text);`
  21. db.Exec(sql)
  22. sql = `insert into users(userId,uname) values(1,'Mike');`
  23. db.Exec(sql)
  24. sql = `insert into users(userId,uname) values(2,'John');`
  25. db.Exec(sql)
  26. rows, err := db.Query("select * from users")
  27. if err != nil {
  28. log.Fatal(err)
  29. }
  30. defer rows.Close()
  31. var users []Users = make([]Users, 0)
  32. for rows.Next() {
  33. var u Users
  34. rows.Scan(&u.UserId, &u.Uname)
  35. users = append(users, u)
  36. }
  37. fmt.Println(users)
  38. }

执行结果:
[{1 Mike} {2 John}]

Go连接MySQL

MySQL推荐驱动
https://github.com/Go-SQL-Driver/MySQL

MySQL连接示例代码

  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. _ "github.com/go-sql-driver/mysql"
  6. )
  7. type Users struct {
  8. UserId int
  9. Uname string
  10. }
  11. func main() {
  12. //db, err := sql.Open("mysql", "user:password@/dbname")
  13. db, err := sql.Open("mysql", "root:root@/test")
  14. if err != nil {
  15. fmt.Println("连接数据库失败")
  16. }
  17. defer db.Close()
  18. var users []Users = make([]Users, 0)
  19. sqlStr := "select * from users"
  20. rows, err := db.Query(sqlStr)
  21. if err != nil {
  22. fmt.Println(err)
  23. } else {
  24. for i := 0; rows.Next(); i++ {
  25. var u Users
  26. rows.Scan(&u.UserId, &u.Uname)
  27. users = append(users, u)
  28. }
  29. fmt.Println(users)
  30. }
  31. }

执行结果
[{1 Mike} {2 John}]

Go连接Oracle

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盘的跟目录下

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

下载后进行以下操作

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

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

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

  1. # Package Information for pkg-config
  2. prefix=C:/instantclient_11_2
  3. exec_prefix=C:/instantclient_11_2
  4. libdir=${exec_prefix}
  5. includedir=${prefix}/sdk/include/
  6. Name: OCI
  7. Description: Oracle database engine
  8. Version: 11.2
  9. Libs: -L${libdir} -loci
  10. Libs.private:
  11. Cflags: -I${includedir}
  • ⑤修改系统环境变量,

添加

  1. PATH=原有PATH;C:\instantclient_11_2;D:\MinGW\bin; (读者根据自己的目录变换一下)
  2. 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
然后执行测试一下吧

Oracle连接示例代码

  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. _ "github.com/wendal/go-oci8"
  6. "log"
  7. )
  8. type Users struct {
  9. UserId int
  10. Uname string
  11. }
  12. func main() {
  13. log.Println("Oracle Driver Connecting....")
  14. //用户名/密码@实例名 如system/123456@orcl、sys/123456@orcl
  15. db, err := sql.Open("oci8", "BOOKMAN/password@orcl")
  16. if err != nil {
  17. log.Fatal(err)
  18. panic("数据库连接失败")
  19. } else {
  20. defer db.Close()
  21. var users []Users = make([]Users, 0)
  22. rows, err := db.Query("select * from users")
  23. if err != nil {
  24. log.Fatal(err)
  25. } else {
  26. for rows.Next() {
  27. var u Users
  28. rows.Scan(&u.UserId, &u.Uname)
  29. users = append(users, u)
  30. }
  31. fmt.Println(users)
  32. defer rows.Close()
  33. }
  34. }
  35. }

执行过程比mysql和sqlite比起来非常缓慢,结果如下
2014/07/08 01:14:05 Oracle Driver Connecting….
[{1 Mike} {2 john}]

参考

https://my.oschina.net/tomlin/blog/155429
https://item.congci.com/-/content/golang-lianjie-sqlite-mysql-oracle-shujuku
http://blog.csdn.net/weiyuefei/article/details/77197567
https://github.com/mattn/go-sqlite3/issues/27


Golang连接SQLite、MySQL、ORacle - 图1