暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

GBase 8a Python Connector使用排雷

原创 飞鸿 2022-03-20
28702

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

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

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驱动会将数据类型自动转换,如下图所示:

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

2、connection_timeout参数

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

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

3、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行,修改后的代码如下所示:

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

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

最后修改时间:2022-09-21 17:31:27
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论