国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Python實現將元組中的元素作為參數傳入函數的操作

瀏覽:7日期:2022-07-22 15:54:06

本文由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 PooledDBimport 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 編程
相關文章:
主站蜘蛛池模板: 国产成人高清在线观看播放 | 午夜在线精品不卡国产 | 视频二区好吊色永久视频 | 亚洲一区二区影视 | 欧美色视频日本片高清在线观看 | 亚洲视频在线一区二区 | 欧美大屁股精品毛片视频 | 成人免费午间影院在线观看 | 日本一级特黄特色大片免费视频 | 美女被躁爽死 | 曰韩一级| 日本网址在线观看 | 国产成人在线视频免费观看 | 99久久精品男女性高爱 | 香蕉tv亚洲专区在线观看 | 天堂中文资源在线8 | 欧美日本在线一区二区三区 | 在线观看成年人免费视频 | 日本免费成人网 | 亚洲高清中文字幕一区二区三区 | 韩国美女爽快一毛片免费 | 亚洲日本aⅴ片在线观看香蕉 | 久久91精品国产99久久yfo | 99国产小视频 | 国产三级在线视频播放线 | 欧美一区二区三区精品 | 91福利精品老师国产自产在线 | 爽爽爽爽爽爽a成人免费视频 | 亚洲国产成a人v在线 | 午夜精品同性女女 | 2019在线亚洲成年视频网站 | a级毛片网站 | a毛片网站 | 久草5| 一级特黄性色生活片一区二区 | 国产99视频精品免费观看7 | 99久久免费中文字幕精品 | 国产免费久久精品99 | 日韩欧美一区二区三区不卡视频 | 亚洲成人一区在线 | 国产高清在线观看视频手机版 |