如何在同一个cursor.execute中执行多条SELECT SQL查询语句
同一个cursor.execute执行多条SELECT语句的解决方法
代码报错核心原因
- 标准
cursor.execute()方法仅接收1个SQL语句作为第一入参,第二个入参是参数化查询的变量列表,直接传入3条独立SQL属于传参格式错误 - 第三条SQL存在语法错误:
WHERE cccccc = = 437多写了一个等号 - 即使拼接成单条SQL,默认配置下大部分数据库驱动也禁止单次执行多语句,避免SQL注入风险
最优解决方法(针对你的同结构查询场景)
你的三个SQL查询字段、表完全一致,仅过滤值不同,直接用IN条件合并为单条查询即可,性能最好也最安全:
def example(event=None): # 合并为单条查询,用参数化查询避免注入 cursor.execute('SELECT aaaaaa From bbbbbb WHERE cccccc IN (%s, %s, %s)', (435, 436, 437)) result=[row[0] for row in cursor] example['value'] = result example.current(0) return result
通用多语句执行方法(适用于不同结构的SELECT查询)
如果确实需要执行结构不同的多条SELECT,按以下两种方案操作:
方案1:循环执行单条语句(最安全,推荐)
def example(event=None): sql_list = [ 'SELECT aaaaaa From bbbbbb WHERE cccccc = %s', 'SELECT aaaaaa From bbbbbb WHERE cccccc = %s', 'SELECT aaaaaa From bbbbbb WHERE cccccc = %s' ] params = [435, 436, 437] result = [] for sql, param in zip(sql_list, params): cursor.execute(sql, (param,)) result.extend([row[0] for row in cursor]) example['value'] = result example.current(0) return result
方案2:开启多语句执行权限(不推荐,存在注入风险)
仅当你完全确认SQL来源可控时使用,不同数据库驱动开启方式不同,以MySQL为例:
- 连接数据库时开启多语句支持:
pymysql.connect(..., client_flag=pymysql.constants.CLIENT.MULTI_STATEMENTS) - 拼接SQL后执行,遍历多个结果集:
def example(event=None): # 用分号拼接所有SQL multi_sql = ''' SELECT aaaaaa From bbbbbb WHERE cccccc = 435; SELECT aaaaaa From bbbbbb WHERE cccccc = 436; SELECT aaaaaa From bbbbbb WHERE cccccc = 437 ''' cursor.execute(multi_sql) result = [] # 遍历每个结果集 while True: result.extend([row[0] for row in cursor]) # 检查是否还有下一个结果集 if not cursor.nextset(): break example['value'] = result example.current(0) return result
内容的提问来源于stack exchange,提问作者William50694
相关产品推荐
相关产品推荐

