Skip to content

适用虚谷数据库版本

v12.10.13



适用虚谷数据库版本

v12.10.13


虚谷Python开发手册 ​

📄字数 13.0K
👁️阅读量 加载中...

虚谷数据库 Python 驱动接口是为 Python2.7 及以上版本的应用提供数据库访问接口,该驱动基于Python Database API Specification v2.0协议编写。

一、开发环境搭建 ​

XuguDB 提供两种方式获取 Python 驱动包:通过产品包或单独下载。

1.1 产品包获取 ​

Python 驱动压缩包默认在虚谷数据库的产品包内,解压产品包后,Python 驱动路径为:Driver/python。不同操作系统和 CPU 架构的Python 驱动,需要通过不同的产品包获取。

1.2 单独获取 ​

Python 驱动还提供在线下载链接,可获取最新试用版和稳定版本的Python驱动。

操作系统CPU下载地址
Windowsx86, 64-bit下载
Linuxx86, 64-bit下载
LinuxARM, 64-bit下载

提示

  1. Windows 版本建议在 Windows10 及以上系统使用。
  2. Linux 版本可以在所有对应的 CPU 架构的类 Unix 系统下运行。
  3. 如果有在其它系统上安装 Python 驱动的需求,请联系虚谷。

1.3 驱动安装 ​

Windows安装

Windows二进制文件压缩包内容如下:
└── xgcondb

将解压文件中的 xgcondb 目录放置到项目启动文件同级目录中即可完成安装操作。

linux安装

linux 二进制文件压缩包内容如下:
├── libxugusql.so
└── xgcondb

将解压文件中的xgcondb目录放置到项目启动文件同级目录,将 libxugusql.so 文件放置到系统动态库文件读取目录下。

二、Python版本支持 ​

虚谷 Python 驱动包支持如下版本:

  • python2.7
  • python3.4
  • python3.6
  • python3.7
  • python3.8
  • python3.9
  • python3.10
  • python3.11

提示

xgcondb 包内整合了所有支持的 Python 版本二进制文件,切换 Python 版本无需切换驱动包。

三、快速入门 ​

以下使用交互式会话方式展示了虚谷 python 驱动基础功能与程序开发流程。

对象创建

创建连接对象与游标对象,连接对象为驱动连接数据库的类实例,游标对象为实际执行SQL的类实例。

Python
>>> import xgcondb

# 创建数据库连接对象
>>> conn = xgcondb.connect(host="127.0.0.1",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='UTF8')

# 创建游标对象
>>> cur = conn.cursor()

执行语句

使用游标对象普通执行、传参执行和批量执行 SQL 语句。

Python
# 执行命令:创建一个新表
>>> cur.execute("CREATE TABLE test_python (id integer identity PRIMARY KEY, name varchar, age integer);")

# 传递参数执行命令
>>> cur.execute("INSERT INTO test_python (name, age) VALUES (?, ?)",('test1', 18))

# 批量传递参数执行命令
>>> cur.executemany("INSERT INTO test_python (name, age) VALUES (?, ?)",(('test2', 19),('test3', 20),('test4', 21)))

# 查询数据库获取数据
>>> cur.execute("SELECT * FROM test_python;")
>>> cur.fetchone()
(1, 'test1', 18)
>>> cur.fetchmany(5)
[(2, 'test2', 19), (3, 'test3', 20), (4, 'test4', 21)]

关闭对象

连接对象与游标对象使用完毕后进行关闭操作。

Python
# 关游标与连接对象
>>> cur.close()
>>> conn.close()

四、xgcondb包 ​

4.1 方法 ​

4.1.1 connect() ​

功能

创建connection类对象。

原型

Python
def connect(*args, **kwargs)

参数

  • host : 数据库ip地址,ips功能使用逗号间隔ip,例如:host="ip1,ip2"。

  • port : 数据库端口。

  • database : 库名。

  • user : 登录使用的用户名。

  • password : 登录用户的密码。

  • charset : 客户端编码信息,python客户端编码默认为utf8。

  • usessl : 加密连接设置,字符串格式传输,传入 "true","on","yes" 表示创建加密连接,其余都为非加密连接。

其他数据库会话连接参数,直接使用数据库会话连接参数名传递参数。

返回值

返回connection对象。

示例

Python
# 基础连接创建
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8', usessl = "true")

# 配置数据库current_schema连接参数
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8',current_schema="TEST")

4.1.2 version() ​

功能

返回驱动版本信息。

原型

Python
def version()

参数

无参数。

返回值

字符串式版本信息。

示例

Python
print(xgcondb.version())
'xgcondb V2.3.7'

五、connection类 ​

connection类封装了数据库会话,通过包函数connect()创建。
连接是线程安全的,可以在多个线程之间共享连接对象。

5.1 方法 ​

5.1.1 cursor() ​

功能

创建游标对象,用于数据库操作执行。

原型

Python
connection.cursor()

参数

无参数

返回值

cursor类对象。

示例

Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()

5.1.2 begin() ​

功能

在连接上开启一个新事务。

原型

Python
connection.begin()

参数

无参数

返回值

无返回值

示例

Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

conn.begin()

5.1.3 commit() ​

功能

提交连接上的事务。

原型

Python
connection.commit()

参数

无参数

返回值

无返回值

示例

Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

conn.execute("create table t_commit(id int,name varchar);")
conn.begin()

conn.execute("insert into t_commit values(1,'test');")
conn.commit()

5.1.4 rollback() ​

功能

回滚连接上的事务。

原型

Python
connection.rollback()

参数

无参数

返回值

无返回值

示例

Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

conn.execute("create table t_rollback(id int,name varchar);")
conn.begin()

conn.execute("insert into t_rollback values(1,'test');")
conn.rollback()

5.1.5 autocommit() ​

功能

设置连接的自动提交属性。

原型

Python
connection.autocommit(bool autocommit)

参数

  • autocommit: 待设置的自动提交属性值

返回值

无返回值

示例

Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

# 设置连接为自动提交
conn.autocommit(True)

# 设置连接为非自动提交
conn.autocommit(False)

5.1.6 ping() ​

功能

连接判活,并根据参数自动重连。

原型

Python
connection.ping([bool reconnect])

参数

  • reconnect:连接失活下,自动重连标志位。(可选,默认为False)

返回值

存活或重连成功返回True,失活返回False。

示例

Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

if conn.ping(True):
    print("conn is alive")

5.1.7 select_db() ​

功能

切换连接对象所连接的数据库。

原型

Python
connection.select_db(string db_name)

参数

  • db_name:连接切换的数据库名。

返回值

无返回值。

示例

Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

conn.select_db("TESTDB")

5.1.8 close() ​

功能

关闭连接对象。

原型

Python
connection.close()

参数

无参数。

返回值

无返回值。

示例

Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

conn.close()

六、cursor 类 ​

游标对象由connection.cursor()方法创建,它们在整个生命周期内都绑定到连接,所有命令都在连接所包裹的数据库会话的上下文中执行。
游标不是线程安全的:多线程应用程序可以从同一连接创建多个游标,并且应该使用单个线程中的每个游标。

6.1 方法 ​

6.1.1 execute() ​

功能

执行数据库语句。

原型

Python
cursor.execute(sql[,parameters])

参数

  • sql: 待执行的sql语句

  • parameters:绑定到sql中的参数,可以为基础类型,一维元组、列表、字典。(可选)

ps : 使用字典传参,需要使用冒号+参数名格式作为占位符,其他传参使用问号作为占位符。

返回值

无返回值。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()

# 执行无参数SQL
cur.execute("create table t_execute(id int,name varchar);")

# 参数为基础类型
cur.execute("insert into t_execute values(1,?)","test")

# 参数为一维元组
cur.execute("insert into t_execute values(2,?)",("test2",))
cur.execute("insert into t_execute values(?,?)",(3,"test3"))

# 参数为一维列表
cur.execute("insert into t_execute values(4,?)",["test4"])
cur.execute("insert into t_execute values(?,?)",[5,"test5"])

# 参数为一维字典
cur.execute("insert into t_execute values(:id,:name)",{"id":6,"name":"test6"})

6.1.2 executemany() ​

功能

以prepare方式批量执行数据库语句。

原型

Python
cursor.executemany(sql,parameters)

参数

  • sql: 待执行的sql语句

  • parameters:绑定到sql中的参数,可以为一维元组、列表、字典,二维元组、列表、字典。

ps : 使用字典传参,需要使用冒号+参数名格式作为占位符,其他传参使用问号作为占位符。

返回值

无返回值。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.execute("create table t_executemany(id int,name varchar);")

# 参数为一维元组
cur.executemany("insert into t_executemany values(1,?)",("test1",))
cur.executemany("insert into t_executemany values(?,?)",(2,"test2"))

# 参数为二维元组
cur.executemany("insert into t_executemany values(?,?)",((3,"test3"),(4,"test4")))

# 参数为一维列表
cur.executemany("insert into t_executemany values(5,?)",["test5"])
cur.executemany("insert into t_executemany values(?,?)",[6,"test6"])

# 参数为二维列表
cur.executemany("insert into t_executemany values(?,?)",[[7,"test7"],[8,"test8"]])

# 参数为一维字典
cur.executemany("insert into t_executemany values(:id,:name)",{"id":9,"name":"test9"})

# 参数为二维字典
cur.executemany("insert into t_executemany values(:id,:name)",{"param1":{"id":10,"name":"test10"},"parm2":{"id":11,"name":"test11"}})

6.1.3 executebatch() ​

功能

以批量发送参数方式执行数据库语句。

原型

Python
cursor.executebatch(sql,parameters)

参数

  • sql: 待执行的sql语句

  • parameters:绑定到sql中的参数,类型二维元组、列表,元素为单列参数的集合。

ps : 传参使用问号作为占位符。

返回值

无返回值。

示例

Python
import xgcondb
conn = xgcondb.connect(host="127.0.0.1",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.execute("create table t_executebatch(id int,name varchar);")
param_1 = [1,2,3,4,5]
param_2 = ["name1","name2","name3","name4","name5",]
cur.executebatch("insert into t_executebatch values(?,?)",[param_1,param_2])

6.1.4 fetchone() ​

功能

提取查询结果集一行数据。

原型

Python
cursor.fetchone()

参数

无参数。

返回值

查询结果集一行数据的元组对象。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.execute("select 1,'test1' from dual")
print(cur.fetchone())
# (1, 'test1')

6.1.5 fetchmany() ​

功能

提取查询结果集多行数据,获取的行数有参数size决定,如果没有传入参数,则由cursor.arraysize属性决定(cursor.arraysize默认为1)。

原型

Python
cursor.fetchmany([size=cursor.arraysize])

参数

  • size: 获取的结果集行数。(可选)

返回值

查询结果集多行数据的二维集合对象,集合对象装的是结果集某一行数据的元组对象。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.execute("create table t_fetchmany(id int,name varchar);")
cur.execute("insert into t_fetchmany values(1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6')")
cur.execute("select * from t_fetchmany")


# 通过size参数控制行数
print(cur.fetchmany(3))
# [(1, 'test1'), (2, 'test2'), (3, 'test3')]

# 通过修改cursor.arraysize 控制行数
cur.arraysize = 3
print(cur.fetchmany())
# [(4, 'test4'), (5, 'test5'), (6, 'test6')]

6.1.6 fetchall() ​

功能

一次性提取结果集的所有数据。

原型

Python
cursor.fetchall()

参数

无参数。

返回值

查询结果集所有数据的二维集合对象,集合对象装的是结果集某一行数据的元组对象。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.execute("create table t_fetchall(id int,name varchar);")
cur.execute("insert into t_fetchall values(1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6')")
cur.execute("select * from t_fetchall")

print(cur.fetchall())
# [(1, 'test1'), (2, 'test2'), (3, 'test3'), (4, 'test4'), (5, 'test5'), (6, 'test6')]

6.1.7 getResultcolname() ​

功能

在结果集存在的情况下:获取对应列号的列名。

原型

Python
cursor.getResultcolname(int colno)

参数

  • colno: 指定列号,列序号从1开始。

返回值

指定列的列名

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.execute("select 1 as col1 from dual")
print(cur.getResultcolname(1))
# COL1

6.1.8 getResultcolseq() ​

功能

在结果集存在的情况下:获取对应列名的列序号

原型

Python
getResultcolseq(string colname)

参数

  • colname:需要获取列序号的列名。

返回值

指定列名的列序号,从1开始。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur.execute("select 1 as col1 from dual")
print(cur.getResultcolseq("COL1"))
# 1

6.1.9 getResultcolsize() ​

功能

在结果集存在的情况下:获取对应列号的精度。

原型

Python
cursor.getResultcolsize(int colno)

参数

  • colno: 指定列号,列序号从1开始。

返回值

指定列的精度。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.execute("select 1 as col1 from dual")
print(cur.getResultcolsize(1))
# 1

6.1.10 getResultcolscale() ​

功能

在结果集存在的情况下:获取对应列号的标度。

原型

Python
cursor.getResultcolscale(int colno)

参数

  • colno: 指定列号,列序号从1开始。

返回值

指定列的标度。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.execute("select 1 as col1 from dual")
print(cur.getResultcolscale(1))
# 0

6.1.11 setinputsizes() ​

功能

事先设置传入执行方法的参数长度。

原型

Python
cursor.setinputsizes(sizes)

参数

  • sizes: 参数尺寸元组

返回值

无返回值。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.close()

cur.setinputsizes((10,10));
cur.execute("select 1 from dual where ? = ?;",(10,10));

6.1.12 setinputtype() ​

功能

事先设置传入执行方法的参数对应的数据库类型,不由驱动自动检测。

原型

Python
cursor.setinputtype(types)

参数

  • types: 参数类型元组

types元素的值为xugu规定的参数类型值。具体值与映射关系如下表:

虚谷数据库数据类型对应参数类型
NULLXG_C_NULL
BOOLEANXG_C_BOOL
VARCHARXG_C_CHAR
TINYINTXG_C_TINYINT
SMALLINTXG_C_SHORT
INTEGERXG_C_INTEGER
BIGINTXG_C_BIGINT
DOUBLEXG_C_DOUBLE
NUMERICXG_C_NUMERIC
DATEXG_C_DATE
TIMEXG_C_TIME
DATETIMEXG_C_DATETIME
BINARYXG_C_BINARY
INTERVAL_YEAR_TO_MONTHXG_C_INTERVAL_YEAR_TO_MONTH
INTERVAL_DAY_TO_SECONDXG_C_INTERVAL_DAY_TO_SECOND
CLOBXG_C_CLOB
BLOBXG_C_BLOB
SYS_REFCURSORXG_C_REFCUR
CHARXG_C_NCHAR

返回值

无返回值。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.close()

cur.setinputtype((XG_C_INTEGER,XG_C_INTEGER));
cur.execute("select 1 from dual where ? = ?;",(10,10));

6.1.13 callproc() ​

功能

执行存储过程支持存储过程带参数(in、out、inout)、存储过程不带参数、存储过程返回结果集。

原型

Python
cursor.callproc(string procname[,parameters,parametertypes])

参数

  • procname: 待执行存储过程名称

  • parameters:若存储过程需要传递参数,第二个参数应该为参数元组对象。

  • parametertypes:若存储过程需要传递参数,第三个参数应该为参数类型元组对象。

返回值

参数列表对象。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.close()

# 执行无参数存储过程
print(cur.callproc("test_no_parameter"))

# 执行有参数存储过程
print(cur.callproc("test_in",(20,),(1,)))
print(cur.callproc("test_out",("xugu",),(2,)))
print(cur.callproc("test_inout",(20,'xugu'),(3,2)))

6.1.14 nextset() ​

功能

多结果集情况下,跳到下一结果集。

原型

Python
cursor.nextset()

参数

无参数。

返回值

存在下一结果集返回True,不存在放回None。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.execute("select 1 from dual;select 2 from dual;")

cur.nextset()
print(cur.fetchone())
# (2,)

6.1.15 close() ​

功能

关闭游标对象。

原型

Python
cursor.close()

参数

无参数。

返回值

无返回值。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.close()

6.2 属性 ​

6.2.1 description ​

功能

获取结果集的列的属性,用户执行 SQL 查询语句后,存在结果集则会返回结果集中每一列的属性,如果不存在结果集则会返回 None。

说明

description列属性按顺序分别存储:(列名,列类型,占位符暂无意义,占位符暂无意义,精度,标度,占位符暂无意义)

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("select 1,'test1' from dual")

print(cur.description)
[('EXPR1', 'TINYINT', None, None, 1, 0, None), ('EXPR2', 'VARCHAR', None, None, 7, 0, None)]

6.2.2 rowcount ​

功能

存储结果集行数,在执行完一句查询语句后,可以通过该属性确定结果集行数

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("select 1 from dual")
print(cur.rowcount)
# 1

6.2.3 arraysize ​

功能

指定fetchmany函数默认的提取行数,默认为1。

示例

Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')

cur = conn.cursor()
cur.execute("create table t_arraysize(id int,name varchar);")
cur.execute("insert into t_arraysize values(1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6')")
cur.execute("select * from t_arraysize")

cur.arraysize = 6
print(cur.fetchmany())
# [(1, 'test1'), (2, 'test2'), (3, 'test3'), (4, 'test4'), (5, 'test5'), (6, 'test6')]

七、示例 ​

7.1 连接数据库并执行SQL语句 ​

Python
#!/usr/bin/python3
import xgcondb

conn = xgcondb.connect(host="127.0.0.1", port="5138", database="SYSTEM", user="SYSDBA", password="SYSDBA") 
cur = conn.cursor()
try:
    cur.execute("CREATE TABLE TAB_FETCHONE_TEST1(A INT, B INT, C VARCHAR, D DATETIME, E NUMBER(4,2))")
    cur.execute("INSERT INTO TAB_FETCHONE_TEST1 VALUES(1001,2001,'XUGU1','2019-01-01',23.54);")
    cur.execute("INSERT INTO TAB_FETCHONE_TEST1 VALUES(1002,2002,'XUGU2','2019-01-02',2.354);")
    cur.execute("INSERT INTO TAB_FETCHONE_TEST1 VALUES(1003,2003,'XUGU3','2019-01-03',35.4);")
    cur.execute("INSERT INTO TAB_FETCHONE_TEST1 VALUES(1004,2004,'XUGU4','2019-01-04',54.00);")
    cur.execute("SELECT * FROM TAB_FETCHONE_TEST1;")
    row = cur.fetchone()
    while row is not None:
        print(row)
    row = cur.fetchone()
    print()
    cur.execute("SELECT * FROM TAB_FETCHONE_TEST1;")
    row = cur.fetchone()
    print(row) 
    print(cur.fetchone())
    print(cur.fetchone())

7.2 大对象的插入与导出 ​

Python
#!/usr/bin/python3
import xgcondb

conn = xgcondb.connect(host="127.0.0.1", port="5138", database="SYSTEM", user="SYSDBA", password="SYSDBA")
## 创建连接的游标
cur = conn.cursor()
cur.execute('create table t_lob(B BLOB, C CLOB);')
#---------------------大对象插入--------------------
clob_fp = open("./clob_test.txt","r")
blob_fp = open("./blob_test.jpg","rb")
clob_buf = clob_fp.read()
blob_buf = blob_fp.read()
cur.execute('insert into t_lob values(?,?);',(blob_buf,clob_buf))

#---------------------大对象导出--------------------
cur.execute('select * from t_lob;')
row = cur.fetchone()
clob_fd = open("./clob_select.txt","w+")
blob_fd = open("./blob_select.jpg","wb+")
blob_fd.write(row[0])
clob_fd.write(row[1])
cur.close()
conn.close()

7.3 存储过程或存储函数提取结果集 ​

Python
#!/usr/local/bin/python3
import xgcondb
conn=xgcondb.connect(host="127.0.0.1",port="5138",database="PYTHON3",user="SYSDBA", password="SYSDBA");
cur=conn.cursor();
cur.execute('create table test(arg1 int, arg2 varchar);')
#---------------------存储过程提取结果集--------------------
cur.execute('''CREATE or replace procedure pro_test(col1 int,col2 OUT SYS_REFCURSOR) as \
declare \
par1 int; \
str2 varchar; \
begin \
par1:=col1; \
for i in 1..par1 loop \
        str2:='insert into test values('||i||',''||par2||'');'; \
        execute immediate str2; \
end loop; \
OPEN col2 FOR SELECT * FROM test; \
end;''');
cur.setinputtype((xgcondb.XG_C_INTEGER,xgcondb.XG_C_REFCUR))
cur.setinputsizes((4,10))
print(cur.callproc('pro_test',(100,'refcur'),(1,2)))
row = cur.fetchall()
for i in row:
    print(i)
cur.clearsize()
cur.cleartype()
cur.execute('drop procedure pro_test;')

#---------------------存储函数提取结果集--------------------
cur.execute('''CREATE or replace function fun_test(col1 int,col2 OUT SYS_REFCURSOR) return varchar as \
declare \
par1 int; \
str2 varchar; \
begin \
par1:=col1; \
for i in 1..par1 loop \
        str2:='insert into test values('||i||',''||par2||'');'; \
        execute immediate str2; \
end loop; \
OPEN col2 FOR SELECT * FROM test; \
return str2; \
end;''');
cur.setinputtype((xgcondb.XG_C_INTEGER,xgcondb.XG_C_REFCUR,xgcondb.XG_C_CHAR))
cur.setinputsizes((4,10,200))
print(cur.callfunc('fun_test',(100,'refcur'),(1,2)))
row = cur.fetchall()
for i in row:
    print(i)
cur.clearsize()
cur.close()
conn.close()

八、常见问题&解决方法 ​

8.1 ImportError: libxugusql.so: cannot open shared object file: No such file or directory ​

在 unix 系列操作系统中使用 XuguDB python 驱动时,需要将 libxugusql.so 放置到系统动态库文件读取目录下,一般为 /usr/lib64/ 或 /usr/lib/ 。