百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

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

toyiye 2024-06-21 12:00 8 浏览 0 评论


Greenplum 作为一款强大的 HTAP 数据库,针对大多数流行语言都有相应的连接库。大部分均是与 PostgreSQL 采用相同的接口,但是也有部分接口是 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")
}

End~

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码