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实现的系统实用log类实例
Jun 30 Python
Tornado协程在python2.7如何返回值(实现方法)
Jun 22 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
Sep 08 Python
Python读取Json字典写入Excel表格的方法
Jan 03 Python
pandas 将list切分后存入DataFrame中的实例
Jul 03 Python
python print输出延时,让其立刻输出的方法
Jan 07 Python
Python两个字典键同值相加的几种方法
Mar 05 Python
pyinstaller打包opencv和numpy程序运行错误解决
Aug 16 Python
Python 日志logging模块用法简单示例
Oct 18 Python
Python matplotlib实时画图案例
Apr 23 Python
python安装读取grib库总结(推荐)
Jun 24 Python
python百行代码实现汉服圈图片爬取
Nov 23 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抓取页面与代码解析 推荐
2010/07/23 PHP
php中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
2019/10/30 PHP
对象特征检测法判断浏览器对javascript对象的支持
2009/07/25 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
2016/09/18 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
JS实现简易留言板增删功能
2020/02/08 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
Python程序退出方式小结
2017/12/09 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
领导的自我鉴定
2013/12/28 职场文书
运动会通讯稿200字
2014/02/16 职场文书
经典团队口号大全
2014/06/21 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
Python Pandas常用函数方法总结
2021/06/15 Python
总结高并发下Nginx性能如何优化
2021/11/01 Servers