Python實(shí)現(xiàn)將元組中的元素作為參數(shù)傳入函數(shù)的操作
本文由Markdown語法編輯器編輯完成。
1. 需求:
現(xiàn)在有一個(gè)Python的需求需要實(shí)現(xiàn):
就是實(shí)現(xiàn)連接一次數(shù)據(jù)庫,就能夠執(zhí)行多條SQL語句,而且這個(gè)SQL語句是需要通過調(diào)用者將每一次執(zhí)行的參數(shù)傳入進(jìn)來,組合成一條完整的SQL語句再去執(zhí)行。
經(jīng)過初步研究,傳入?yún)?shù)時(shí),通過數(shù)組的形式,數(shù)組中的每一個(gè)元素則是一個(gè)元組tuple(因?yàn)镾QL中需要填入的參數(shù)可能是多個(gè),所以需要通過元組的形式傳入)。
比如SQL語句的形式為:
basic_sql = ‘SELECT * FROM series se where se.body_part like “%{}%” and se.modality = “{}”'
在這條SQL中,有兩個(gè)變量需要傳入,分別用{}表示,一個(gè)是序列的body_part, 一個(gè)是序列的modality。準(zhǔn)備傳入的參數(shù)為:
[(‘Chest', ‘CT'), (‘Lung', ‘MRI'), (‘Leg', ‘DR')]等。
希望通過以下的格式化函數(shù),將參數(shù)傳入:
SELECT * FROM series se where se.body_part like “%{}%” and se.modality = “{}”.format(param1, param2) 這樣。
2. 函數(shù)實(shí)現(xiàn):
雖然看起來這個(gè)需求非常明確,也比較簡單。但是實(shí)現(xiàn)起來,還是花費(fèi)了我好長的時(shí)間。究其原因,主要的困惑就是如何能夠?qū)⑦@個(gè)參數(shù)傳入到SQL中,并且去執(zhí)行SQL。
2.1 思路一:
在基于需求中提到的那個(gè)解決思路,我希望是拼接字符串,將拼接后的整個(gè)字符串作為完整的SQL語句,然后執(zhí)行生成結(jié)果。
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語句已經(jīng)被執(zhí)行, 結(jié)果是:\n %s" % str(result)) result_list.append(result) except Exception as e: logger.exception(u"執(zhí)行sql語句時(shí),發(fā)生了錯(cuò)誤: %s", e.message) raise finally: self._db_connection.close() return result_list
但是在執(zhí)行這個(gè)函數(shù)的時(shí)候,會報(bào)異常,異常說明是:tuple out of bounds.
以下是問題產(chǎn)生的原因:
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'傳入?yún)?shù)要求是列表類型,請檢查傳入?yún)?shù)類型!') result_list = [] try: self._db_connection = self._db_connection_pool.connection() self._db_cursor = self._db_connection.cursor() for params in params_list: # 將每一個(gè)元組中存的參數(shù)傳入format中,替換sql中的變量值. # 如果數(shù)組中的元素不是元組,則sql中只有一個(gè)變量需要替換,將參數(shù)直接替換. 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語句已經(jīng)被執(zhí)行, 結(jié)果是:\n %s" % str(result)) if len(result) > 0: result_list.append(result) except Exception as e: logger.exception(u"執(zhí)行sql語句時(shí),發(fā)生了錯(cuò)誤: %s", e.message) raise finally: self._db_connection.close() return result_list
這段代碼中,最主要的修改就是關(guān)于處理參數(shù)的部分. 由于傳入的參數(shù)是一個(gè)數(shù)組,數(shù)組中的每一個(gè)元素是一個(gè)tuple, tuple內(nèi)的元素個(gè)數(shù)是由第2個(gè)參數(shù)sql中需要傳入的參數(shù)個(gè)數(shù)對應(yīng)的。
如上述需求中提到的,傳入的sql中需要補(bǔ)充兩個(gè)參數(shù)值,分別是body_part和modality, 因此數(shù)組中每一個(gè)tuple的長度也是2.
這樣通過*tuple的方式,可以依次取出tuple中的每一個(gè)元素作為變量,傳入前面的sql語句中,組成一個(gè)完整的sql語句。
然后再調(diào)用db.execute, 便可以獲取到查詢結(jié)果.
補(bǔ)充知識:Python——利用元組作為函數(shù)返回值:輸出最值和個(gè)數(shù)
廢話不多說,看代碼!
# 利用元組作為函數(shù)返回值:輸出最值和個(gè)數(shù) 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實(shí)現(xiàn)將元組中的元素作為參數(shù)傳入函數(shù)的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- python元組拆包實(shí)現(xiàn)方法
- python空元組在all中返回結(jié)果詳解
- python中把元組轉(zhuǎn)換為namedtuple方法
- 10個(gè)示例帶你掌握python中的元組
- python 元組和列表的區(qū)別
- python中元組的用法整理
- python 元組的使用方法
- python中讀入二維csv格式的表格方法詳解(以元組/列表形式表示)
- Python namedtuple命名元組實(shí)現(xiàn)過程解析
- python提取word文件中的所有圖片
- python可視化hdf5文件的操作
- Python 如何讀取.txt,.md等文本文件
- Python文件基本操作實(shí)用指南
- 將Python代碼打包成.exe可執(zhí)行文件的完整步驟
- Python文件名的匹配之clob庫
- Python批量將csv文件轉(zhuǎn)化成xml文件的實(shí)例
- Python基礎(chǔ)之元組與文件知識總結(jié)
相關(guān)文章
Python餐飲AI機(jī)器人學(xué)習(xí)數(shù)據(jù)網(wǎng)絡(luò)抓取
在餐飲行業(yè),AI機(jī)器人可以通過學(xué)習(xí)大量的相關(guān)數(shù)據(jù)來提供更好的服務(wù)和體驗(yàn),在文本中,我們將介紹如何使用python進(jìn)行餐飲A?I機(jī)器人學(xué)習(xí)數(shù)據(jù)的網(wǎng)絡(luò)抓取,并提供代碼的示例和最佳實(shí)踐2023-12-12python實(shí)現(xiàn)從pdf文件中提取文本,并自動翻譯的方法
今天小編就為大家分享一篇python實(shí)現(xiàn)從pdf文件中提取文本,并自動翻譯的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11Python中ValueError報(bào)錯(cuò)的原因和解決辦法
在Python編程中,ValueError是一種非常常見的異常類型,它通常發(fā)生在函數(shù)接收到一個(gè)有效類型但不適合該函數(shù)操作的值時(shí),本文將深入探討ValueError的報(bào)錯(cuò)原因、提供詳細(xì)的解決辦法,并通過豐富的代碼示例來加深理解,需要的朋友可以參考下2024-07-07Python循環(huán)語句For?Range用法示例詳解
這篇文章主要為大家介紹了Python循環(huán)語句For?Range用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Python項(xiàng)目管理工具Poetry使用示例詳解
這篇文章主要為大家介紹了Python項(xiàng)目管理工具Poetry使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-0910張動圖學(xué)會python循環(huán)與遞歸問題
今天為大家整理了十張動圖GIFS,有助于認(rèn)識循環(huán)、遞歸、二分檢索等概念的具體運(yùn)行情況。代碼實(shí)例以Python語言編寫,非常不錯(cuò),感興趣的朋友跟隨小編一起學(xué)習(xí)吧2021-02-02python模擬預(yù)測一下新型冠狀病毒肺炎的數(shù)據(jù)
這篇文章主要介紹了python模擬預(yù)測一下新型冠狀病毒肺炎的數(shù)據(jù) ,需要的朋友可以參考下2020-02-02