虚谷Python开发手册
📄字数 13.1K
👁️阅读量 加载中...
虚谷数据库 Python 驱动接口是为 Python2.7 及以上版本的应用提供数据库访问接口,该驱动基于Python Database API Specification v2.0协议编写。
一、开发环境搭建
XuguDB 提供两种方式获取 Python 驱动包:通过产品包或单独下载。
1.1 产品包获取
Python 驱动压缩包默认在虚谷数据库的产品包内,解压产品包后,Python 驱动路径为:Driver/python
。不同操作系统和 CPU 架构的Python 驱动,需要通过不同的产品包获取。
1.2 单独获取
Python 驱动还提供在线下载链接,可获取最新试用版和稳定版本的Python驱动。
操作系统 | CPU | 下载地址 |
---|---|---|
Windows | x86, 64-bit | 下载 |
Linux | x86, 64-bit | 下载 |
Linux | ARM, 64-bit | 下载 |
提示
- Windows 版本建议在 Windows10 及以上系统使用。
- Linux 版本可以在所有对应的 CPU 架构的类 Unix 系统下运行。
- 如果有在其它系统上安装 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.versin())
'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.autocommit([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规定的参数类型值。具体值与映射关系如下表:
虚谷数据库数据类型 | 对应参数类型 |
---|---|
NULL | XG_C_NULL |
BOOLEAN | XG_C_BOOL |
VARCHAR | XG_C_CHAR |
TINYINT | XG_C_TINYINT |
SMALLINT | XG_C_SHORT |
INTEGER | XG_C_INTEGER |
BIGINT | XG_C_BIGINT |
DOUBLE | XG_C_DOUBLE |
NUMERIC | XG_C_NUMERIC |
DATE | XG_C_DATE |
TIME | XG_C_TIME |
DATETIME | XG_C_DATETIME |
BINARY | XG_C_BINARY |
INTERVAL_YEAR_TO_MONTH | XG_C_INTERVAL_YEAR_TO_MONTH |
INTERVAL_DAY_TO_SECOND | XG_C_INTERVAL_DAY_TO_SECOND |
CLOB | XG_C_CLOB |
BLOB | XG_C_BLOB |
SYS_REFCURSOR | XG_C_REFCUR |
CHAR | XG_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/
。