Python實現(xiàn)將元組中的元素作為參數(shù)傳入函數(shù)的操作
本文由Markdown語法編輯器編輯完成。
1. 需求:
現(xiàn)在有一個Python的需求需要實現(xiàn):
就是實現(xiàn)連接一次數(shù)據(jù)庫,就能夠執(zhí)行多條SQL語句,而且這個SQL語句是需要通過調(diào)用者將每一次執(zhí)行的參數(shù)傳入進來,組合成一條完整的SQL語句再去執(zhí)行。
經(jīng)過初步研究,傳入?yún)?shù)時,通過數(shù)組的形式,數(shù)組中的每一個元素則是一個元組tuple(因為SQL中需要填入的參數(shù)可能是多個,所以需要通過元組的形式傳入)。
比如SQL語句的形式為:
basic_sql = ‘SELECT * FROM series se where se.body_part like “%{}%” and se.modality = “{}”’
在這條SQL中,有兩個變量需要傳入,分別用{}表示,一個是序列的body_part, 一個是序列的modality。準備傳入的參數(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ù)實現(xiàn):
雖然看起來這個需求非常明確,也比較簡單。但是實現(xiàn)起來,還是花費了我好長的時間。究其原因,主要的困惑就是如何能夠?qū)⑦@個參數(shù)傳入到SQL中,并且去執(zhí)行SQL。
2.1 思路一:
在基于需求中提到的那個解決思路,我希望是拼接字符串,將拼接后的整個字符串作為完整的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語句時,發(fā)生了錯誤: %s', e.message) raise finally: self._db_connection.close() return result_list
但是在執(zhí)行這個函數(shù)的時候,會報異常,異常說明是: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 PooledDBimport 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: # 將每一個元組中存的參數(shù)傳入format中,替換sql中的變量值. # 如果數(shù)組中的元素不是元組,則sql中只有一個變量需要替換,將參數(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語句時,發(fā)生了錯誤: %s', e.message) raise finally: self._db_connection.close() return result_list
這段代碼中,最主要的修改就是關于處理參數(shù)的部分. 由于傳入的參數(shù)是一個數(shù)組,數(shù)組中的每一個元素是一個tuple, tuple內(nèi)的元素個數(shù)是由第2個參數(shù)sql中需要傳入的參數(shù)個數(shù)對應的。
如上述需求中提到的,傳入的sql中需要補充兩個參數(shù)值,分別是body_part和modality, 因此數(shù)組中每一個tuple的長度也是2.
這樣通過*tuple的方式,可以依次取出tuple中的每一個元素作為變量,傳入前面的sql語句中,組成一個完整的sql語句。
然后再調(diào)用db.execute, 便可以獲取到查詢結(jié)果.
補充知識:Python——利用元組作為函數(shù)返回值:輸出最值和個數(shù)
廢話不多說,看代碼!
# 利用元組作為函數(shù)返回值:輸出最值和個數(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實現(xiàn)將元組中的元素作為參數(shù)傳入函數(shù)的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。
相關文章:
1. 在Android中使用WebSocket實現(xiàn)消息通信的方法詳解2. 淺談python出錯時traceback的解讀3. Python importlib動態(tài)導入模塊實現(xiàn)代碼4. python matplotlib:plt.scatter() 大小和顏色參數(shù)詳解5. windows服務器使用IIS時thinkphp搜索中文無效問題6. ASP 信息提示函數(shù)并作返回或者轉(zhuǎn)向7. Nginx+php配置文件及原理解析8. 利用promise及參數(shù)解構(gòu)封裝ajax請求的方法9. .NET中l(wèi)ambda表達式合并問題及解決方法10. JSP數(shù)據(jù)交互實現(xiàn)過程解析
