在 mysql 驱动的众多属性中,有一个属性叫做
allowmultiqueries=false #默认false
这个属性的含义是是否允许一次执行多个查询。
使用了该参数之后,mysql 可以一次执行多条不同的语句。 语句之间用分号分割。
如下所示:
from directsql.connector import MysqlPool,MysqlConnection
from pymysql.constants import CLIENT
client_flag=CLIENT.MULTI_STATEMENTS
conn=MysqlConnection(conn_cmd="*******",client_flag=client_flag)
sql="""
select id from JL_EXT_3402;
select count(1) from JL_EXT_3402;
"""
conn=conn.get_connection()
cursor=conn.cursor()
print(cursor.execute(sql))
print(cursor.fetchall())
print(cursor.nextset())
print(cursor.fetchall())
print(cursor.nextset())
print(cursor.fetchall())
这时的游标会有多个结果集。可以通过cursor.nextset() 判断是否还有下一个结果集。
可以看到,第一个查询返回了 条数3和3个ID
第二个 查询则返回了总条数。
对此可以将其写成一个通用方法如下:
def get_multiqueries(self,sql,params=None,cursor_type=None):
"""
同时执行多个sql ,一次性返回所有结果集.
sql 是以 分号; 进行分割的多条语句
@queries : [(sql1,param1),(sql2,param2),...]
@cursor_type : dict or None
"""
conn = self.get_connection()
cursor = conn.cursor(DictCursor) if cursor_type == 'dict' else conn.cursor() #此处由于需要返回查询结果集,所以不支持流式游标
try:
cursor.execute(sql,params)
results=[]
results.append(cursor.fetchall())
while cursor.nextset():
results.append(cursor.fetchall())
conn.commit()#这个要在最后进行提交
return results
except Exception :
cursor.close()
conn.rollback()
traceback.print_exc()
return False
在一些条件查询里,接口中往往要分页的同时展示符合条件的总条数。 使用这种允许执行多条sql的方式是个不错的解决方案。
下面附 mysql驱动中其他属性的含义。