返回首页

gbase数据、南大通用产品文档:GBase8a使用游标操作数据库

更新日期:2024年09月11日

使用游标操作数据库资源,包括:执行SQL 语句、调用存储过程、执行事务、获
取结果集操作。
执行SQL 语句
连接创建后,可以使用连接的cursor 方法生成游标,然后可以使用游标执行SQL
语句和获取结果集。
执行单条语句
使用游标执行单条SQL 语句。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258}
try:
conn = connect()
conn.connect(**config)
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1276
执行多条语句
使用游标执行多条SQL 语句。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS test(id INT, name
VARCHAR(20))")
cur.execute("INSERT INTO test VALUES(%s,%s)", (1,'hello'))
获取结果集
当使用游标执行返回结果集的SQL语句后,可以使用游标的fetchone 方法获取结
果集中的一行数据、fetchmany 方法获取结果集中的多行数据、fetchall 方法获取结
果集中的所有数据。
获取一行数据
使用游标的fetchone 方法获取结果集中的一行数据。fetchone 接口可以循环调用,
直到结果集中的数据获取完毕。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1277
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS test")
cur.execute("CREATE TABLE IF NOT EXISTS test(id INT, name
VARCHAR(50))")
cur.execute("INSERT INTO test VALUES(1,'hello'), (2,'world')")
cur.execute("SELECT * FROM test")
row = cur.fetchone()
while row is not None:
print row
row = cur.fetchone()
cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
获取多行数据
使用游标的fetchmany方法获取结果集中的多行数据。
fetchmany接口可以循环调用,
直到结果集中的数据获取完毕。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS test")

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1278
cur.execute("CREATE TABLE test (COL1 INT, COL2 VARCHAR(20))")
opfmt = "INSERT INTO test(COL1, COL2) VALUES(%s, %s)"
rows = []
for i in xrange(0, 100):
rows.append((i, "row" + str(i)))
cur.executemany(opfmt, rows)
cur.execute("SELECT * FROM test")

row = cur.fetchmany(3)
while row:
print row
row = cur.fetchmany(4)

cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
获取所有行数据
使用游标的fetchall 方法获取结果集中的所有行数据。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS test")
cur.execute("CREATE TABLE test (COL1 INT, COL2 VARCHAR(20))")
opfmt = "INSERT INTO test(COL1, COL2) VALUES(%s, %s)"

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1279
rows = []
for i in xrange(0, 100):
rows.append((i, "row" + str(i)))
cur.executemany(opfmt, rows)
cur.execute("SELECT * FROM test")

print cur.fetchall()

cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
获取多个结果集数据
当有多个结果集时,可使用如下方法获取多个结果集的数据。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS test")
cur.execute("CREATE TABLE test (COL1 INT, COL2 VARCHAR(20))")
opfmt = "INSERT INTO test(COL1, COL2) VALUES(%s, %s)"
rows = []
for i in xrange(0, 100):
rows.append((i, "row" + str(i)))
cur.executemany(opfmt, rows)

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1280
iters = cur.execute("SELECT * FROM test limit 5;SELECT * FROM TEST
LIMIT 10, 5", multi_stmt= True)
for ter in iters:
print ter.fetchall()

cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
获取下一个结果集
当有多个结果集返回时,可以使用游标的nextset 方法跳过结果集后直接获取下一
个结果集的数据。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS test")
cur.execute("CREATE TABLE test (COL1 INT, COL2 VARCHAR(20))")
opfmt = "INSERT INTO test(COL1, COL2) VALUES(%s, %s)"
rows = []
for i in xrange(0, 100):
rows.append((i, "row" + str(i)))
cur.executemany(opfmt, rows)
cur.execute("SELECT * FROM test limit 5;SELECT * FROM TEST LIMIT
10, 5;SELECT * FROM TEST LIMIT 15, 5", multi_stmt= True)

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1281
cur.nextset(2)
print cur.fetchall()

cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()

注意
获取下一个结果集方法nextset 不能在遍历过程中使用,如下面的例子。
iters = cur.execute("SELECT * FROM test limit 5;SELECT * FROM TEST LIMIT
10, 5;SELECT * FROM TEST LIMIT 15, 5", multi_stmt= True)
for ter in iters:
cur.nextset()
print cur.fetchall()

执行存储过程
使用游标的callproc 方法可以调用GBase 数据库的存储过程。存储过程返回的结果
集通过错误!未找到引用源。小节中描述的方法获取。
如果存储过程包含输出参数,
则可以通过游标的save_param_val 方法获取输出参数
值。

下面的样例代码使用callproc 方法调用存储过程,并获取存储过程结果集。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1282
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP PROCEDURE IF EXISTS TESTCALLPROC2")
cur.execute("CREATE PROCEDURE TESTCALLPROC2() \
BEGIN \
select 3; \
select 4; \
END")
res = cur.callproc("TESTCALLPROC2")
for r in res:
print r.fetchall()
cur.execute("DROP PROCEDURE IF EXISTS TESTCALLPROC2")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()

下面的样例代码使用callproc 方法调用存储过程,并通过save_param_val 方法
获取存储过程返回值。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP PROCEDURE IF EXISTS TESTCALLPROC1")
cur.execute("CREATE PROCEDURE TESTCALLPROC1(\
IN pFac1 INT, IN pFac2 INT, OUT pProd INT) \
BEGIN \
SET pProd := pFac1 * pFac2; \
select 1; \

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1283
select 2; \
END")
res = cur.callproc("TESTCALLPROC1", (3,4,0))
for r in res:
print r.fetchall()
print cur.save_param_val()
cur.execute("DROP PROCEDURE IF EXISTS TESTCALLPROC2")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
执行事务
通过设置连接参数中的autocommit=False 参数,
即可控制事务,
可通过连接的commit
方法提交事务、rollback 方法回滚事务。

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1284
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test',
'autocommit':False,}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP PROCEDURE IF EXISTS test")
cur.execute("CREATE
TABLE
IF
NOT
EXISTS
test(id
INT,
val
VARCHAR(20))")
cur.execute("INSERT INTO test VALUES(1,'hello')")
conn.rollback()
cur.execute("INSERT INTO test VALUES(2,'world')")
conn.commit()
cur.execute("SELECT * FROM test")
print cur.fetchall()
cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
或者使用cur.execute("set autocommit=false")来开启一个事物。

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1285
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP PROCEDURE IF EXISTS test")
cur.execute("CREATE
TABLE
IF
NOT
EXISTS
test(id
INT,
val
VARCHAR(20))")
cur.execute("set autocommit=false")
cur.execute("INSERT INTO test VALUES(1,'hello')")
conn.rollback()
cur.execute("INSERT INTO test VALUES(2,'world')")
conn.commit()
cur.execute("SELECT * FROM test")
print cur.fetchall()
cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
插入二进制数据
使用游标的execute 可以插入二进制数据内容。请参考下面的样例。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
fobj = open("c:\\1.gif",'rb')
fbytes = fobj.read()
fobj.close()

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1286
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS test(f blob)")
cur.execute("INSERT INTO test VALUES(_binary%s)",(fbytes,))
cur.execute("DROP TABLE IF EXISTS test")
cur.close()
except (GBaseError.DatabaseError, IOError), err:
print err
finally:
conn.close()
批量插入数据
当使用insert 语句插入数据时,通过调用游标的executemany 方法可以实现数据批
量插入。参见如下样例代码。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS test")
cur.execute("CREATE TABLE test (COL1 INT, COL2 VARCHAR(20))")
opfmt = "INSERT INTO test(COL1, COL2) VALUES(%s, %s)"
rows = []
for i in xrange(0, 100):
rows.append((i, "row" + str(i)))
cur.executemany(opfmt, rows)
cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
获取加载返回信息
#!/bin/env python
from GBaseConnector import connect, GBaseError
connStr
=
{'host':'192.168.6.89','port':5258,
'user':'gbase','passwd':'gbase20110531',

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1287
'database':'test', 'connection_timeout':9999999, 'charset':'utf8'}
conn = connect (**connStr)
cursor = conn.cursor()
cursor.execute("LOAD
GCLUSTER
DATA
INFILE
'ftp://gbase:gbase@192.168.6.94/rebalance_tmpdata/lineitem.tbl' into table t1 fields
terminated by '|';")
print cursor.info
print cursor.rowcount
cursor.close()
conn.close()

功能
这个参数用于设置控制SQL 执行的并行度
(并行线程数)

如果不设定该参数值,
则该参数的默认值是0
(0 表示用默认并行度,
默认并行度取值是线程池最大可用
资源数的一半)。如果设定该参数值,则最小值取值为1。
表6- 65 参数值范围说明表
默认值
最小值
最大值
0
1
线程池最大可用线程数


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 959 -
您的 GBase 8s 软件包括演示数据库。GBase 8s ESQL/C 在本出版物中,还包括许多演示
程序和示例的源文件,其中有些访问该演示数据库。
在 Windows(TM) 环境中,您可在 %GBASEDBTDIR%\demo\esqldemo 目录中找到 GBase
8s ESQL/C 示例程序的源文件。
在 UNIX(TM) 操作系统上,您可在 $GBASEDBTDIR/demo/esqlc 目录中找到 GBase 8s
ESQL/C 示例程序的源文件。包括 GBase 8s ESQL/C 的 esqldemo 脚本将源文件从
$GBASEDBTDIR/demo/esqlc 目录复制至当前目录内。
这些示例说明如何使用 GBase 8s ESQL/C 库函数来访问智能大对象。如果您正在使用
GBase 8s 作为您的数据库服务器,则仅这些示例适用。