「实战」助力数据库开发之接口篇 - Golang 连接 Greenplum

「实战」助力数据库开发之接口篇 - Golang 连接 Greenplum

Greenplum 作为一款强大的 HTAP 数据库,针对大多数流行语言都有相应的连接库。大部分均是与 PostgreSQL 采用相同的接口,但是也有部分接口是 Greenplum 专门优化后用于自身使用的。今天开始,给大家分~ . ] I o n享一系列语言接口的连接库及使用方式。

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

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

支持列表

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

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

安装方法

与其他的 Go 包安装方式一样,只需@ } i要在 go/src 目录下执行 go get 命令即可将需要的包下载。

go get github.com/lib/pq

如果网络条件有限,. [ R }不能直接 go get 联网下载,也可以直接在外网机器上用 gI r R ~ P B ] 1 To get 或者 git 下载好,然后将代码复制到对+ { p o x R G ,应格式的目录下(放到 go 文件夹下的 src 文件夹下的 github.r l B i W Qcom 文件夹下的 lib 文件夹下的 pq 下)。

使用方法

下面展示一段 Golang 连q 8 * h v h S接数据库查询6 $ - h的代码,进行简单分析。

package main

import (
\"database/sql\"
\"fma 8 d { m N J Dt\c ? 4 z C a G t 8"
_ \"github.com/lib/pq\"
\"log\"
)

func m+ 8 8 E V J xain() {
db, err := sql.Open(\"postgres\", \"user=chris password=12X ) # `3 dbname=postgres ho` + Z 8st=127.0.0.1 port=5432 sslm& o 2ode=disable\")
if err != nil {
log.Fatalt Y # h o W m & /(err)
}
defer db.Close()

/n $ )/查询数据
rows, err := db.Qu@ - H tery(\"sele8 K z h i : n @ct 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\"
\b 4 0 2 @ l K A 5"log\"
)

注意这里在导入 lib/pq 时,前面加了下划线(_),因为通常来说,不直接使用驱动所提供的方法,而是应该使用 database 中的 sql.DB,因此在导入 lib/pq 驱动时,这里使用了匿名导入的方式(在包路径前添加 _),当导入了Q , / @ 9 S ?一个数据库驱动后,此驱动会自行初j ~ M始化并注册自己到 Golang 的 database/sql 上L $ A M S 9 ] i ]下文中,因此我们就可以通过 database/sql 包提供H ~ h n q L !的方法访问数据库了。

database/sql 默认提供了 MySQL、PostgrJ + . I R / WeSQL 和 SQLite 的支持,不需要手工注册。

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

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

  • 打开数据库连接
  • 执行增删改查操作
  • 扫描结果集然后处理(查询操作)
  • 错误处理
  • 关闭数据库连接

数据源的连接字符串通常拼接成“user=chris password=123 dbname=postgres host=127.0.0.1 port=5V W { O w Y m | j432 ss@ a 9 I L z ` N %lmoH L ) c | 2 6 Ade=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=verik u q Efy-full”。

数据库的操N R + ; [ e ( { N作支持开发语言中常见的两种处理方式:

  1. 直接查询
  2. prepare statement

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

package main

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

var db *sql.D9 a % R f R ? o (B

func sqlOpen() {
var err error
d7 . a f ab, err = sql.Open(\"postgT k m ;res\", \"user=gpadmin password=123 dbname=postgres host=172.16.142.191 port=5432 sslmode=disable\")
//port是数据库的端口号,默认是5432,如果改了,这里一定要自定义;/ V p
//user就是你数据库的登录帐号;
//dbname就是你在数据库里面建立的数据库的名字;
//sslmode就是安全验证模式;
checkEr+ i Gr(err)

}

func sqlCreate() {
//创建表
_, err := db.Exec(\"dr9 L s e v Vop table t_user\")
checkErr(# b 6 4 Y aerr)
_, err1 := db.Exec(\"create table t_user(unam: ( T i ~ b we text,dptname text,cr@ *eate_time timest; % O L M iamp)\")
checkErr(I | # 9 G { ;err1)
}

func sqlInsert() {
//插入数据
stmt, err := db.Prepc G 5 i F 8 W Fare(\"INSERT INTO t_user(uname,dptname,create_time) VALUES($1,$2,$3)\")
checkErr(err)

_, err = stmt.Exec(\"chrisr 5 n\", \"软件1部\", \"2020-01-08\")
//这里的三个参数就是对应上面的{ K ($1,$2,$3了

checkErr(err)
}

func sqlDelete(J : ) N V W X) {
//删除数据
stmt, err :G c d p @= db.Prepare(\"delete from t_user where uname=$1\")
checkErr(err)

res, err := stmt.Exec(\") a N 3chris\")
checkErr(err)

affect, err := res.RowsAffected()
checkEr@ x _ O X 0 I ?r(err)

fmt.Println(\"rows affect:\", affect)
}

func sqlS@ g [elect() {
//查询数据
rows, err := db.Query(\"SELECT * FROM t_user\")
checkErr(err)

println! G . i S p $ x(\"-------k t ( 6 | a m |----\")
for rows.Next() {m N ] K Q P
vU k Zar uname string
var dptname string
var crel e ~ate_time string
err = rows.Scan(&amN $ E ^p;uname, &dptname, &0 ` |amp;r Z T # V )create_tk O B - z 9 E + [ime)
checkErr(err)
fmt.Println( \"name = \", uname, \"\\ndep = \", dptname, \"\\ncreated = \", create_- 0 6 8 Y dtime, \"\\n\")
}
}

func sqlUpdate() {
/6 2 H [/更新数据
stmt, err := d1 S v L jb.Prepare# ] O ? H(\"update t_user set dptname=$1 where uname=$2\")
checkErr(err)

res, err := stmt.Exec(\} H s t T G"软件1部, M K : ] #\",\"jenny\")
checp ( (kErr(err)

afM m 0 0fect, err := res.RowsAffected()
cR . wheckErr(err)

fmt.Println(\"rows affect:\", affect)
}
func sq7 , 5 r #lClose() {
db.Close()
}

func checkErr(errp k P I 5 error) {
if err != nil {
p~ U X 5 Z - H nanic(err)
}
}

func main() {
sep := \"----------\\n\"
sqlOpen()
println(sep, \"*sqlW 8 mOpen\")

sqlCreate()
printlE e Mn(sep, \"*sqlCreate\")
time.Sleep(time.Second*2)^ : 7 z Z

sqlSelect4 H g `()
println(sep, \"*N o H M #sJ = M = Q : I nqlSelect\")
time.Sleep(time.Second*2)

sqlIns3 , g y ert()
sqlSelect()
println(sep, \"*sqlInsert\")
time.Sleep(time.Second*5)

sqlUpv 3 F Q g l d ! ,date()
sqlSelect()
println(sw | Q T I g P aeA { % Q D [ Hp, \"*sqlUpdate\")
time.Sleep(time.Seco/ c i `nd*2)

sqlDelete(D q ,)
sqlSelect()
println(sep, \"*sqlDelete\")
time.Sleep(time.Second*2)

sqlClose()
println(sep, \"*sqlClose\")
}

End~

上一篇

有了OPPO Reno3 Pro,普通人也可以拍出精彩视频

下一篇

五部不得不看的高智商悬疑电影,喜欢烧脑电影的千万别错过

你也可能喜欢

  • 暂无相关文章!

发表评论

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

提示:点击验证后方可评论!

插入图片
返回顶部