本文由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.

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实现将元组中的元素作为参数传入函数的操作相关推荐

  1. python列表添加元组_python 列表与元组的操作简介

    列表 列表是可变的(mutable)--可以改变列表的内容,这不同于字符串和元组,字符串和元组都是不可变的.接下来讨论一下列表所提供的方法. list函数 可以使用list函数来创建列表: list( ...

  2. python循环控制语句将数值转化成字符串_python基础入门详解(文件输入/输出内建类型字典操作使用方法)...

    f=open("foo.txt") line=f.readline() while line: print line, line=f.readline() #读取一行,包括换行符' ...

  3. python数组赋值给变量_Python:将数组中的元素导出到变量中 (unpacking)

    问题 你需要将数组(list)或元组(tuple)中的元素导出到N个变量中. 解决方案 任何序列都可以通过简单的变量赋值方式将其元素分配到对应的变量中,唯一的要求就是变量的数量和结构需要和序列中的结构 ...

  4. python读取压缩文件的大小_python查看zip包中文件及大小的方法

    python查看zip包中文件及大小的方法 本文实例讲述了python查看zip包中文件及大小的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python import ...

  5. python去重复元素_Python实现去除列表中重复元素的方法总结【7种方法】

    这里首先给出来我很早之前写的一篇博客,Python实现去除列表中重复元素的方法小结[4种方法],感兴趣的话可以去看看,今天是在实践过程中又积累了一些方法,这里一并总结放在这里. 由于内容很简单,就不再 ...

  6. python文件内容倒序_python实现对列表中的元素进行倒序打印

    1.案例要求: """有列表["a", "d", "f", "j","z&quo ...

  7. python列表元素筛选_Python如何筛选序列中的元素

    本篇文章给大家带来的内容是关于Python如何筛选序列中的元素 ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.需求 序列中含有一些数据,我们需要提取其中的值或根据某些标准对序列 ...

  8. python列表去重并删除重复那个_Python实现去除列表中重复元素的方法总结【7种方法】...

    如何用python实现剔除列表中相同的元素 >>> a = [1, 2, 3, 1, 2, 3] >>> list(set(a)) [1, 2, 3] 先转成 se ...

  9. python request.post 字典参数以json_Python requests.post方法中data与json参数区别详解

    在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json. data与json既可以是str类型,也可以是dict类型. 区别: 1.不管json是 ...

最新文章

  1. 在layui中使用ajax传值给后台,解决layui批量传值到后台操作时出现传值为空的问题...
  2. 1.2、什么是函数?什么是方法
  3. Python3比较运算符
  4. mySQL初学者一些最常用的命令行
  5. 专转本计算机专业录取分数线,2018江苏专转本各专业分数线一览!
  6. 【Java】统计字符个数
  7. matlab 信道模拟 差错概率,移动信道差错序列的分布概率模拟法及门限电平的讨论...
  8. ajax怎样带值,ajax携带状态值
  9. 有关文档流的一些注意事项
  10. iPython Notebook安装和初体验
  11. 基于 Amazon Nitro Enclaves 构建安全的可信执行环境
  12. matlab复信道化滤波器组,宽带数字信道化EDA设计
  13. 激光中心线算法MATLAB仿真
  14. 做好软件测试的关键是什么,做好测试计划和测试用例的工作的关键是什么?
  15. linux bootrom ftp,H3C交换机通过以太口应用ftp方式升级bootrom软件
  16. namedtuple的使用
  17. 老男孩数据库学习记录
  18. HDLBITS笔记34:Lemmings1、Lemmings2、Lemmings3、Lemmings4
  19. INF442 Amphi 6: Supervised learning and k-NN predictors | Genericity
  20. uni-app自定义页面导航内容

热门文章

  1. Mysql面试常见知识点总结(一)
  2. hadoop--HDFS_DataNode工作机制
  3. 数据产品-短视频评估体系构建
  4. 《DeepLearning.ai 深度学习笔记》发布,黄海广博士整理
  5. 前端每日值得花时间看的博客
  6. 码云 GVP 项目 SequoiaDB 完成 C 轮数千万美元融资
  7. proxomitron 个人代理工具
  8. jsp 或 php 等view之中使用javascript简单处理的使用技巧
  9. webpack+es6+node+react初实践及总结
  10. SSIS包如何动态指定文件路径