GBase 8a Python Connector使用排雷

GBase 8a是一款优秀的MPP数据库,使用Python3开发ETL程序可以并行执行,并异步输出格式化的日志到文件,比传统的使用存储过程开发ETL的方式更优。

GBase 8a 提供的 GBase Python Connector可以用于操作GBase 8a数据库。本人使用的gbase8a_pythonAPI4python3.x目前的版本为3.0.1,该版本在使用中有一些问题,需要改进才能更好的使用,以下内容基于该版本。

端口参数

官方的接口参数一般有以下常用参数:

conn = GBaseConnector.connect(

host=host,

user=user,

password=password,

database=database,

autocommit=autocommit)

从源文件GBaseConnection.py分析可以看到,调用connect方法后调用了parsecfg方法解析参数,源代码如下:

再看一下init方法中对参数的初始化:

从源文件GBaseConnection.py中可以看到默认端口为5258,数据类型为整型。从java转过来的程序员习惯使用properties文件作为参数文件,这时候读取的参数都是字符,使用dict传递参数后,GBase 8a驱动会将数据类型自动转换,如下图所示:

因此,端口号无论是使用字符串,还是使用整型,都能正确识别。

connection_timeout参数

从源文件可以看出,该参数为默认为30秒,数据类型为整数。但是如果直接从properties文件加载,却不能正确识别,经过源码分析,是因为驱动程序未对该参数做类型转换,采取直接赋值的方式接收参数,如下图所示:

因此,connection_timeout参数不设置的情况下,默认就是30秒,如果ETL执行过程比较长,日志中将会出现"Lost connection to GBase server during query"的错误。

datetime类型数据的检索

python3.x中使用gbase 8a的驱动在检索datetime类型数据时,会报“TypeError: a bytes-like object is required, not ‘str’”的错误,经过跟踪调试,发现错误原因是datetime类型字段返回的数为bytes类型,驱动程序在执行GBaseUtils.py文件的_DATETIME_to_python方法(第321行)中的 (sd, st) = v.split(’ ')发生错误。经过分析,发现该代码在python 2.7的驱动能正确执行,但是在pyhont 3.x时,该代码应该增加数据类型转换。增加321行和322行,修改后的代码如下所示:

同样,操作time类型字段时,也有这样的错误,需要对_TIME_to_python方法作同样的修改。

虽然GBase 8a的python驱动有一些问题,但是,瑕不掩瑜,这并不妨碍GBase 8a是一款优秀的MPP数据库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值