接口篇 – Golang连接Greenplum

Golang 作为 Google 开源的一款编译型开发语言,经过多年发展,在开发界占据了很大的份额,市面上针对 Greenplum 的 Golang 连接库也有很多,但是最著名的还是 github.com/lib/pq。

Golang 为连接数据库专门提供了一个公共包叫 database/sql,在进行数据库连接时,只需要遵循该库的注册方式将 lib/pq(https://github.com/lib/pq) 注册为 postgres 驱动即可。

支持列表

目前该包支持全系列 Greenplum 产品,提供的一些功能如下:

  • 支持数据库增删改查
  • 支持在数据库中直接执行DDL或维护语句(VACUUM等)
  • 支持所有普通数据类型
  • 支持 bytea
  • 支持 hstore
  • 支持 SSL
  • 支持 COPY FROM
  • 支持 pgpass

安装方法

与其他的 Go 包安装方式一样,只需要在 go/src 目录下执行 go get 命令即可将需要的包下载。go get github.com/lib/pq 如果网络条件有限,不能直接 go get 联网下载,也可以直接在外网机器上用 go get 或者 git 下载好,然后将代码复制到对应格式的目录下(放到 go 文件夹下的 src 文件夹下的 github.com 文件夹下的 lib 文件夹下的 pq 下)。

使用方法

下面展示一段 Golang 连接数据库查询的代码,进行简单分析。

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq"
    "log"
)

func main() {
    db, err := sql.Open("postgres", "user=chris password=123 dbname=postgres host=127.0.0.1 port=5432 sslmode=disable")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    //查询数据
    rows, err := db.Query("select version()")

    for rows.Next() {
        var version string
        rows.Scan(&version)
        fmt.Println(version)
    }
}

从上面代码可以看到,我们需要首先导入 database/sql 和 lib/pq 两个包。

import (“database/sql””fmt” “github.com/lib/pq””log”)注意这里在导入 lib/pq 时,前面加了下划线(),因为通常来说,不直接使用驱动所提供的方法,而是应该使用 database 中的 sql.DB,因此在导入 lib/pq 驱动时,这里使用了匿名导入的方式(在包路径前添加 _),当导入了一个数据库驱动后,此驱动会自行初始化并注册自己到 Golang 的 database/sql 上下文中,因此我们就可以通过 database/sql 包提供的方法访问数据库了。

database/sql 默认提供了 MySQL、PostgreSQL 和 SQLite 的支持,不需要手工注册。

接下来就是在函数中构造连接 url 然后进行查询了

以下就是具体的连接使用逻辑,通常的逻辑一般为:

  • 打开数据库连接
  • 执行增删改查操作
  • 扫描结果集然后处理(查询操作)
  • 错误处理
  • 关闭数据库连接 数据源的连接字符串通常拼接成“user=chris password=123
    dbname=postgres host=127.0.0.1 port=5432 sslmode=disable”的形式,字符串中分别对应了 Greenplum 数据库的用户名、密码、数据库名、主机ip、Greenplum 端口号和 sslmode。

db, err := sql.Open(“postgres”, “user=chris password=123 dbname=postgres host=127.0.0.1 port=5432 sslmode=disable”)除了上面的数据源连接串形式,也可以下面这种方式连接(不太常用,作用是一样的):“postgres://chris:password@127.0.0.1:5432/postgres?sslmode=verify-full”。

数据库的操作支持开发语言中常见的两种处理方式:

1.直接查询
2.prepare statement

下面给大家展示所有可能涉及的增删改查操作的语法,可以直接在数据库中测试使用。

package main
 
import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq"
    "time"
)
 
var db *sql.DB
 
func sqlOpen() {
    var err error
    db, err = sql.Open("postgres", "user=gpadmin password=123 dbname=postgres host=172.16.142.191 port=5432 sslmode=disable")
    //port是数据库的端口号,默认是5432,如果改了,这里一定要自定义;
    //user就是你数据库的登录帐号;
    //dbname就是你在数据库里面建立的数据库的名字;
    //sslmode就是安全验证模式;
    checkErr(err)
 
}
 
func sqlCreate() {
    //创建表
    _, err := db.Exec("drop table t_user")
    checkErr(err)
    _, err1 := db.Exec("create table t_user(uname text,dptname text,create_time timestamp)")
    checkErr(err1)
}
 
func sqlInsert() {
    //插入数据
    stmt, err := db.Prepare("INSERT INTO t_user(uname,dptname,create_time) VALUES($1,$2,$3)")
    checkErr(err)
 
    _, err = stmt.Exec("chris", "软件1部", "2020-01-08")
    //这里的三个参数就是对应上面的$1,$2,$3了
 
    checkErr(err)
}
 
func sqlDelete() {
    //删除数据
    stmt, err := db.Prepare("delete from t_user where uname=$1")
    checkErr(err)
 
    res, err := stmt.Exec("chris")
    checkErr(err)
 
    affect, err := res.RowsAffected()
    checkErr(err)
 
    fmt.Println("rows affect:", affect)
}
 
func sqlSelect() {
    //查询数据
    rows, err := db.Query("SELECT * FROM t_user")
    checkErr(err)
 
    println("-----------")
    for rows.Next() {
        var uname string
        var dptname string
        var create_time string
        err = rows.Scan(&uname, &dptname, &create_time)
        checkErr(err)
        fmt.Println( "name = ", uname, "\ndep = ", dptname, "\ncreated = ", create_time, "\n")
    }
}
 
func sqlUpdate() {
    //更新数据
    stmt, err := db.Prepare("update t_user set dptname=$1 where uname=$2")
    checkErr(err)
 
    res, err := stmt.Exec("软件1部","jenny")
    checkErr(err)
 
    affect, err := res.RowsAffected()
    checkErr(err)
 
    fmt.Println("rows affect:", affect)
}
func sqlClose() {
    db.Close()
}
 
func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}
 
func main() {
    sep := "----------\n"
    sqlOpen()
    println(sep, "*sqlOpen")
 
    sqlCreate()
    println(sep, "*sqlCreate")
    time.Sleep(time.Second*2)
 
    sqlSelect()
    println(sep, "*sqlSelect")
    time.Sleep(time.Second*2)
 
    sqlInsert()
    sqlSelect()
    println(sep, "*sqlInsert")
    time.Sleep(time.Second*5)
 
    sqlUpdate()
    sqlSelect()
    println(sep, "*sqlUpdate")
    time.Sleep(time.Second*2)
 
    sqlDelete()
    sqlSelect()
    println(sep, "*sqlDelete")
    time.Sleep(time.Second*2)
 
    sqlClose()
    println(sep, "*sqlClose")
}

本文从CSDN(点击查看原文)转载而来。不代表烟海拾贝立场,如若转载,请注明出处:https://somirror.com/3703.html

(0)
上一篇 2023-01-17 11:29
下一篇 2023-01-18 13:49

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注