返回首页

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()

%
MPPDB CPU time % in busy time
:

使用“新建存储过程”功能,您可以图形化创建存储过程。
在“数据库导航”中,右键单击Schema 节点下的存储过程节点,选择菜单
中的“新建存储过程”菜单项,如下图所示:

GBaseDataStudio 管理工具手册
南大通用数据技术股份有限公司
- 199 -
图5- 566 新建存储过程菜单项
点击“新建存储过程”菜单弹出新建对话框,如下图所示:
图5- 567 新建存储过程对话框
在新建存储过程对话框中填写名称,然后点击“确定”按钮进入存储过程
编辑界面如下图所示:

GBaseDataStudio 管理工具手册
- 200 -
南大通用数据技术股份有限公司
图5- 568 新建存储过程编辑
在存储过程编辑界面“源”编辑框中编辑存储过程主体,编辑完成后点击
工具栏中的“保存”按钮或者点击“Ctrl+S”来保存,弹出保存确认界面如下
图所示:

GBaseDataStudio 管理工具手册
南大通用数据技术股份有限公司
- 201 -
图5- 569 新建存储过程编辑
点击“保存”按钮,您可以保存这次新建存储过程;点击“复制”按钮,
您可以将新建存储过程的SQL 语句拷贝到粘贴板;点击“取消”按钮,您可以
取消本次保存。保存后将刷新存储过程内容。