Python实现将元组中的元素作为参数传入函数的操作


Posted in Python onJune 05, 2020

本文由Markdown语法编辑器编辑完成。

1. 需求:

现在有一个Python的需求需要实现:

就是实现连接一次数据库,就能够执行多条SQL语句,而且这个SQL语句是需要通过调用者将每一次执行的参数传入进来,组合成一条完整的SQL语句再去执行。

经过初步研究,传入参数时,通过数组的形式,数组中的每一个元素则是一个元组tuple(因为SQL中需要填入的参数可能是多个,所以需要通过元组的形式传入)。

比如SQL语句的形式为:

basic_sql = ‘SELECT * FROM series se where se.body_part like “%{}%” and se.modality = “{}”'

在这条SQL中,有两个变量需要传入,分别用{}表示,一个是序列的body_part, 一个是序列的modality。准备传入的参数为:

[(‘Chest', ‘CT'), (‘Lung', ‘MRI'), (‘Leg', ‘DR')]等。

希望通过以下的格式化函数,将参数传入:

SELECT * FROM series se where se.body_part like “%{}%” and se.modality = “{}”.format(param1, param2) 这样。

2. 函数实现:

虽然看起来这个需求非常明确,也比较简单。但是实现起来,还是花费了我好长的时间。究其原因,主要的困惑就是如何能够将这个参数传入到SQL中,并且去执行SQL。

2.1 思路一:

在基于需求中提到的那个解决思路,我希望是拼接字符串,将拼接后的整个字符串作为完整的SQL语句,然后执行生成结果。

def execute_multi_sql(self, sql, params_list):
 result_list = []
  try:
   self._db_connection = self._db_connection_pool.connection()
   self._db_cursor = self._db_connection.cursor()
 for params in params_list:
  combined_sql = []
  combined_sql.append(sql)
  combined_sql.append('.format(')
  combined_sql.append(','.join(map(str, params)))
  combined_sql.append(')')
  combined_sql = ''.join(combined_sql)
  logger.debug("executing sql: %s" % combined_sql)
  self._db_cursor.execute(combined_sql)
  result = self._db_cursor.fetchall()
  logger.debug(u"SQL语句已经被执行, 结果是:\n %s" % str(result))
  result_list.append(result)
 except Exception as e:
   logger.exception(u"执行sql语句时,发生了错误: %s", e.message)
   raise
  finally:
   self._db_connection.close()
   return result_list

但是在执行这个函数的时候,会报异常,异常说明是:tuple out of bounds.

以下是问题产生的原因:

2.2 思路二:

通过google搜索,最终找到的解决方案是如下链接所示:

expanding tuples into arguments.

https://stackoverflow.com/questions/1993727/expanding-tuples-into-arguments

from DBUtils.PooledDB import PooledDB
import logging
......

 def execute_multi(self, sql, params_list):
  if not isinstance(params_list, list):
   raise Exception(u'传入参数要求是列表类型,请检查传入参数类型!')
  result_list = []
  try:
   self._db_connection = self._db_connection_pool.connection()
   self._db_cursor = self._db_connection.cursor()

   for params in params_list:
    # 将每一个元组中存的参数传入format中,替换sql中的变量值.
    # 如果数组中的元素不是元组,则sql中只有一个变量需要替换,将参数直接替换.
    if isinstance(params, tuple):
     combined_sql = sql.format(*params)
    else:
     combined_sql = sql.format(params)

    logger.debug("executing sql: %s" % combined_sql)
    self._db_cursor.execute(combined_sql)
    result = self._db_cursor.fetchall()
    logger.debug(u"SQL语句已经被执行, 结果是:\n %s" % str(result))
    if len(result) > 0:
     result_list.append(result)
  except Exception as e:
   logger.exception(u"执行sql语句时,发生了错误: %s", e.message)
   raise
  finally:
   self._db_connection.close()
   return result_list

这段代码中,最主要的修改就是关于处理参数的部分. 由于传入的参数是一个数组,数组中的每一个元素是一个tuple, tuple内的元素个数是由第2个参数sql中需要传入的参数个数对应的。

如上述需求中提到的,传入的sql中需要补充两个参数值,分别是body_part和modality, 因此数组中每一个tuple的长度也是2.

这样通过*tuple的方式,可以依次取出tuple中的每一个元素作为变量,传入前面的sql语句中,组成一个完整的sql语句。

然后再调用db.execute, 便可以获取到查询结果.

补充知识:Python——利用元组作为函数返回值:输出最值和个数

废话不多说,看代码!

# 利用元组作为函数返回值:输出最值和个数
def yuanzu(*xxx):
  i = max(xxx)
  j = min(xxx)
  print("最大值是%s" % i)
  print("最小值是%s" % j)
  l = len(xxx)
  print("长度是{0}".format(l))

yuanzu(1,2,5,6,5)

以上这篇Python实现将元组中的元素作为参数传入函数的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python创建关联数组(字典)的方法
May 04 Python
python thrift搭建服务端和客户端测试程序
Jan 17 Python
python爬虫获取小区经纬度以及结构化地址
Dec 30 Python
Python3数字求和的实例
Feb 19 Python
详解python中的线程与线程池
May 10 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 Python
简单了解Python3里的一些新特性
Jul 13 Python
python pyecharts 实现一个文件绘制多张图
May 13 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
Aug 03 Python
Python常用外部指令执行代码实例
Nov 05 Python
python的变量和简单数字类型详解
Sep 15 Python
Python Dict找出value大于某值或key大于某值的所有项方式
Jun 05 #Python
python3检查字典传入函数键是否齐全的实例
Jun 05 #Python
Python使用20行代码实现微信聊天机器人
Jun 05 #Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 #Python
Python爬虫爬取百度搜索内容代码实例
Jun 05 #Python
python3读取autocad图形文件.py实例
Jun 05 #Python
Python实现加密接口测试方法步骤详解
Jun 05 #Python
You might like
PHP中设置时区,记录日志文件的实现代码
2013/01/07 PHP
preg_match_all使用心得分享
2014/01/31 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
JavaScript的public、private和privileged模式
2009/12/28 Javascript
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
利用了jquery的ajax实现二级联互动菜单
2013/12/02 Javascript
自己使用js/jquery写的一个定制对话框控件
2014/05/02 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
2016/02/29 Javascript
Javascript实现登录记住用户名和密码功能
2017/03/22 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
2017/12/09 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
2020/06/11 Javascript
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[01:59]游戏“zheng”当时试玩会
2019/08/21 DOTA
Python常用模块介绍
2014/11/21 Python
python插入排序算法实例分析
2015/07/03 Python
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
用Python进行简单图像识别(验证码)
2018/01/19 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
Django之腾讯云短信的实现
2020/06/12 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
HTML5实现签到 功能
2018/10/09 HTML / CSS
薇姿法国官网:Vichy法国
2021/01/28 全球购物
介绍一下grep命令的使用
2012/06/28 面试题
函授自我鉴定范文
2014/02/06 职场文书
如何用JavaScript检测当前浏览器是无头浏览器
2021/04/27 Javascript