在使用cur.execute(“SELECT 1 from test;”)执行语句时,会产生查询结果,若不使用fetchall()将结果全部取出就执行下一条execute(sql)时,会产生报错Unread result found
例如:
iters = cur.execute(“SELECT 1 from test;”)
cur.execute(“SELECT * from test;”)
报错信息:
Traceback (most recent call last):
File “/home/gbase/Desktop/GBASEapi/new/runme.py”, line 125, in test_4
cur.execute(“SELECT * from test;”)
File “/usr/local/lib/python3.7/dist-packages/GBaseConnector/cursor.py”, line 521, in execute
self._connection.handle_unread_result()
File “/usr/local/lib/python3.7/dist-packages/GBaseConnector/connection.py”, line 1172, in handle_unread_result
raise GBaseError.InternalError(“Unread result found”)
GBaseConnector.GBaseError.InternalError: Unread result found
方法1:如果只需要执行select而不需要输出查询结果,可以通过execute(sqls,multi_stmt=True)实现,multi_stmt=True表示execute执行多行命令,他会返回一个可迭代类generator,迭代项为GBaseConnector.cursor.GBaseCursor类,此时的查询结果不在游标cur内,而在execute返回值的游标里,所以在使用multi_stmt=True时可不取出查询结果继续执行execute()。
例如:
iters1 = cur.execute(“SELECT 1 from test;”, multi_stmt=True)
iters2 = cur.execute(“SELECT 1 from test;”, multi_stmt=True)
iters 3= cur.execute(“SELECT 1 from test;”, multi_stmt=True)
同时,此时如果想取出查询结果,需要遍历iters,使用fetchall()得到查询结果。而sqls中可能不全为select语句,此时使用针对非select语句使用fetchall()会产生报错 No result set to fetch from,可以通过如下两种方式进行避免:1.使用try,except捕获异常;2.使用list()取出结果,若是非select语句的话会得到空list。
例如:
iters = cur.execute(“UPDATE test SET id=%s,name=%s;SELECT * from test;DELETE FROM test;SELECT * from test;”, params=(2, ‘world’), multi_stmt=True)
for i in iters:
print(list(i))
结果为:
[]
[(2, ‘world’)]
[]
[]
方法2:如果只需要执行select而不需要输出查询结果,也可以通过executemany(sql,param_list)实现,区别于execute,此时的select的查询结果无法通过cur.fetchall()得到,也不存在executemany的返回值。
例如:
opfmt = “SELECT 1 from test;”
rows = []
for i in range(0, 10000):
rows.append(‘’)
cur.executemany(opfmt,rows)
cur.execute(opfmt)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




