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查看微信好友是否删除自己
Dec 19 Python
Python计时相关操作详解【time,datetime】
May 26 Python
Python实现的中国剩余定理算法示例
Aug 05 Python
Python中利用xpath解析HTML的方法
May 14 Python
Python数据集切分实例
Dec 08 Python
python Tkinter的图片刷新实例
Jun 14 Python
Python程序控制语句用法实例分析
Jan 14 Python
Python验证码截取识别代码实例
May 16 Python
Java ExcutorService优雅关闭方式解析
May 30 Python
python中if及if-else如何使用
Jun 02 Python
Django返回HTML文件的实现方法
Sep 17 Python
pandas按条件筛选数据的实现
Feb 20 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
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
2017/01/20 PHP
PHP获取真实客户端的真实IP
2017/03/07 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
javascript中使用正则计算中文长度的例子
2014/04/29 Javascript
JavaScript中使用自然对数ln的方法
2015/06/14 Javascript
Javascript自执行匿名函数(function() { })()的原理浅析
2016/05/15 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
详解本地Node.js服务器作为api服务器的解决办法
2017/02/28 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
js实现验证码功能
2020/07/24 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
Django基础之Model操作步骤(介绍)
2017/05/27 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
Python常用模块sys,os,time,random功能与用法实例分析
2020/01/07 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
世界上最大的网络主机公司:1&1
2016/10/12 全球购物
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
高中学生评语大全
2014/04/25 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js