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 相关文章推荐
Python2.x版本中基本的中文编码问题解决
Oct 12 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
Apr 11 Python
Python实现比较扑克牌大小程序代码示例
Dec 06 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
Python使用Selenium爬取淘宝异步加载的数据方法
Dec 17 Python
Python 切分数组实例解析
Nov 07 Python
Django中提示消息messages的设置方式
Nov 15 Python
新手常见Python错误及异常解决处理方案
Jun 18 Python
Python3.7安装pyaudio教程解析
Jul 24 Python
python生成word合同的实例方法
Jan 12 Python
python基础之匿名函数详解
Apr 21 Python
Python网络编程之ZeroMQ知识总结
Apr 25 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
Wordpress php 分页代码
2009/10/21 PHP
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
php实现高效获取图片尺寸的方法
2014/12/12 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
thinkPHP模板中函数的使用方法示例
2016/11/30 PHP
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
BootStrap响应式导航条实例介绍
2016/05/06 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
javascript操作cookie
2017/01/17 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
基于Vue.js与WordPress Rest API构建单页应用详解
2019/09/16 Javascript
微信小程序实现上拉加载功能
2019/11/20 Javascript
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
python 实现图片裁剪小工具
2021/02/02 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
什么是.net的Remoting技术
2016/07/08 面试题
信息技术专业大学生职业生涯规划书
2014/01/24 职场文书
平安工地建设方案
2014/05/06 职场文书
培训通知
2015/04/17 职场文书
遗愿清单观后感
2015/06/09 职场文书
一行代码python实现文件共享服务器
2021/04/22 Python
win10清理dns缓存
2022/04/19 数码科技
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python
MySql统计函数COUNT的具体使用详解
2022/08/14 MySQL