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实现文件路径和url相互转换的方法
Jul 06 Python
详解Python的Lambda函数与排序
Oct 25 Python
Python编程之string相关操作实例详解
Jul 22 Python
Python绘制七段数码管实例代码
Dec 20 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
Apr 18 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
react+django清除浏览器缓存的几种方法小结
Jul 17 Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 Python
Django实现列表页商品数据返回教程
Apr 03 Python
基于python实现简单网页服务器代码实例
Sep 14 Python
Python 把两层列表展开平铺成一层(5种实现方式)
Apr 07 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
我的群发邮件程序
2006/10/09 PHP
PHP 伪静态技术原理以及突破原理实现介绍
2013/07/12 PHP
PHP中的Memcache详解
2014/04/05 PHP
php文件下载处理方法分析
2015/04/22 PHP
php常用表单验证类用法实例
2015/06/18 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
2016/06/13 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
use jscript List Installed Software
2007/06/11 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
JavaScript中用toString()方法返回时间为字符串
2015/06/12 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
pyqt4教程之widget使用示例分享
2014/03/07 Python
Python开发的HTTP库requests详解
2017/08/29 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
Python pandas如何向excel添加数据
2020/05/22 Python
C语言变量的命名规则都有哪些
2013/12/27 面试题
2015年教师师德师风承诺书
2015/04/28 职场文书
尊师重教主题班会
2015/08/14 职场文书
选购到合适的激光打印机
2022/04/21 数码科技