原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
在 Python 应用程序中访问 GBase 8s 数据库时, gbase8sdb 驱动提供功能支持。其中, Variable 对象是处理数据库变量的核心组件,它允许开发者灵活地操作数据,实现自定义的数据转换和处理逻辑。本文将介绍 gbase8sdb 中 Variable 对象的使用方法。
简介
gbase8sdb是GBase 8s 数据库 Python 驱动程序,它是一个 Python 扩展模块,用于访问 GBase 8s 数据库。它支持 Python DB API v2.0 规范,并扩展了一些功能。
环境准备
1、安装 Python
如果您尚未安装Python, 请先安装 Python 3。您可以使用 Python 3.7 到 3.12 的任意版本。
2、安装 gbase8sdb
从Python第三方包仓库 PyPI 安装 gbase8sdb
python -m pip install gbase8sdb
3、安装 GSDK
通过官方渠道获取相应版本的 GBase 8s 客户端库(GSDK 1.1版本),并进行解压安装。
下载地址: www.gbase.cn/download/gb…
4、设置环境变量
设置 LD_LIBRARY_PATH 环境变量
export LD_LIBRARY_PATH=$GSDK_PATH/lib
安装数据库并准备实例
gbase8sdb 驱动允许 Python 3 应用程序连接到 GBase 8s 数据库, 支持 GBase 8s V8.8_3.6.2 及以上版本。
示例使用的数据库服务器信息如下:
表 1 示例使用的数据库信息
| 序号 | 参数名称 | 示例参数值 | 说明信息 |
|---|---|---|---|
| 1 | 主机名称 | 192.168.139.128 | 数据库服务器的主机名称或IP地址 |
| 2 | 端口号 | 62045 | 数据库服务器使用的端口号 |
| 3 | 数据库服务名 | server366_rc1 | 数据库服务名称(DBSERVERNAME) |
| 4 | 数据库名称 | testdbutf8 | 数据库名称(DBNAME) |
| 5 | 数据库字符集 | zh_CN.utf8 | 数据库字符集(DB_LOCALE) |
| 6 | 客户端字符集 | zh_CN.utf8 | 客户端字符集(CLIENT_LOCALE) |
| 7 | GLU支持 | 1 | GLU支持(GL_USEGLU) |
gbase8sdb中Variable对象的使用
下面介绍一下gbase8sdb中Variable对象的使用。
Variable.getvalue([pos=0])
返回变量中指定位置的值。
Variable.setvalue(pos, value)
设置变量中指定位置的值。
Variable.actual_elements
这个只读属性返回变量中的实际元素数量。
Variable.buffer_size
这个只读属性返回为每个元素分配的缓冲区大小(以字节为单位)。
Variable.convert_nulls
这个只读属性返回当从数据库中获取空值时是否调用 outconverter 方法。
Variable.inconverter
这个只读属性指定用于将数据从 Python 转换为 GBase 8s 数据库的方法。方法签名是 converter(value),预期的返回值是要绑定到数据库的值。 如果此属性为 None,则值将直接绑定而无需转换。
Variable.num_elements
这个只读属性返回数组中分配的元素数量,或者可以提取到变量或绑定到变量的标量项的数量。
Variable.outconverter
这个只读属性指定用于将数据从 GBase 8s 数据库转换为 Python 的方法。方法签名是 converter(value), 预期的返回值是要返回到 Python 的值。如果此属性为 None,则值将直接返回而无需转换。
Variable.size
这个只读属性返回变量的大小。对于字符串,此值是字符数。对于其他所有类型,这与属性 bufferSize 的值相同。
Variable.type
这个只读属性返回变量的类型,将是 数据库类型常量 之一。
Variable.values
这个只读属性返回变量中所有实际位置的值的副本,形式为列表。 这相当于对每个有效位置调用 getvalue(), 长度将对应于 actualElements 属性的值。
用法介绍
1、代码示例
import gbase8sdb
username = "gbasedbt"
password = "111111"
servername = "server366_rc1"
ip = "192.168.139.128"
port = 62045
database = "testdbutf8"
dblocale = "zh_CN.utf8"
clientlocale = "zh_CN.utf8"
dsn = gbase8sdb.makedsn(server_name=servername, db_name=database, host=ip, port=port)
conn = gbase8sdb.connect(user=username, password=password, dsn=dsn)
cursor = conn.cursor()
var = cursor.var(gbase8sdb.DB_TYPE_NUMBER)
print('----------使用 setvalue 和 getvalue 方法----------')
var.setvalue(0, 10)
print('使用getvalue()方法获取变量中所有实际位置的值是:', var.getvalue(0))
print('使用values属性获取变量中所有实际位置的值是:', var.values)
print('----------查看 Variable 对象的属性----------')
var2 = cursor.var(typ=gbase8sdb.DB_TYPE_VARCHAR, size=3, arraysize=2)
print('变量中的实际元素数量为:', var2.actual_elements)
print('每个元素分配的缓冲区大小(以字节为单位)是:', var2.buffer_size)
print('当从数据库中获取空值时是否调用 outconverter 方法:', var2.convert_nulls)
print('数组中分配的元素数量是:', var2.num_elements)
print('变量的大小是:', var2.size)
print('变量的类型是:', var2.type)
print("---------- inconverter 的使用----------")
def inconverter(value):
"""Convert input value by adding prefix"""
if value is None:
return None
return f"PREFIX_{value}"
var = cursor.var(str, inconverter=inconverter)
var.setvalue(0, "test_value")
result = var.getvalue()
print(result)
print("---------- outconverter 的使用----------")
def type_handler(cursor, metadata):
return cursor.var(
metadata.type_code,
outconverter=lambda v: f"|{v}|" if v else "",
convert_nulls=True,
arraysize=cursor.arraysize,
)
cursor.outputtypehandler = type_handler
cursor.execute(
"""
select 'First - A', 'First - B'
from dual
union all
select 'Second - A', null
from dual
union all
select null, 'Third - B'
from dual
"""
)
rows = cursor.fetchall()
print(rows)
2、运行结果
----------使用 setvalue 和 getvalue 方法----------
使用getvalue()方法获取变量中所有实际位置的值是: 10.0
使用values属性获取变量中所有实际位置的值是: [10.0]
----------查看 Variable 对象的属性----------
变量中的实际元素数量为: 2
每个元素分配的缓冲区大小(以字节为单位)是: 12
当从数据库中获取空值时是否调用 outconverter 方法: False
数组中分配的元素数量是: 2
变量的大小是: 3
变量的类型是: <DbType DB_TYPE_VARCHAR>
---------- inconverter 的使用----------
PREFIX_test_value
---------- outconverter 的使用----------
[('|First - A|', '|First - B|'), ('|Second - A|', ''), ('', '|Third - B|')]
通过本文的介绍,你已经了解了 gbase8sdb 中 Variable 对象的核心方法和属性,以及如何在实际开发中使用这些功能。 Variable 对象的灵活性和功能,使得数据处理更加高效和便捷。希望这些内容能帮助你在 Python 应用程序中更好地使用 GBase 8s 数据库。如果你在使用过程中遇到任何问题,欢迎随时在社区中提问,我们在这里为你提供支持!
原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。